2012-04-25 15 views
7

Tengo una función en un archivo ejecutable Fortran y necesito que sea un archivo DLL para que pueda llamar a su funciones de un programa en C#Haciendo DLL Fortran y llamarlo desde C#

 FUNCTION TSAT11(P) 
C  ** IGNORE IMPLEMENTATION ** 
     TSAT11 = SX*TSAT2(X) + SXL1*TSAT3-273.15 
     RETURN 
     END 

P es un flotador y la función devuelve un flotador

Aquí no sé nada en Fortran ni llamo a dlls desde C#, así que explíqueme un poco más.

estoy usando Compaq Visual Fortran y C# 2008.

Gracias por su tiempo.

(Si lo desea, puede ver el código completo Here [Es un programa para calcular las propiedades de agua y vapor)]

+0

http://support.microsoft.com/kb/123841? – SixOThree

+0

Indique cómo se define 'P', y qué devuelve la función en cuanto a tipos y dimensiones de matriz. – ja72

+0

¿Sabe cómo crear archivos DLL con su compilador Fortran? – dsolimano

Respuesta

9

Aquí hay un ejemplo con flotadores de precisión simple.

biblioteca Fortran contiene:

FUNCTION TSAT11(P) 
!DEC$ ATTRIBUTES ALIAS:'TSAT11' :: TSAT11 
!DEC$ ATTRIBUTES DLLEXPORT :: TSAT11 
!DEC$ ATTRIBUTES VALUE :: P 
REAL, INTENT(IN) :: P 
REAL :: TSAT11 
    ! Examle calculation 
    TSAT11 = P - 273.15 
RETURN 
END FUNCTION 

Con la función de llamada

class Program 
{ 
    [DllImport("calc.dll")] 
    static extern float TSAT11(float P); 

    static void Main(string[] args) 
    { 
     float p = 300f; 
     float t = TSAT11(p); 
     // returns 26.8500061 
    } 
} 

mismo modo para una matriz (debe declarar el tamaño)

FUNCTION TSAT12(P,N) 
!DEC$ ATTRIBUTES ALIAS:'TSAT12' :: TSAT12 
!DEC$ ATTRIBUTES DLLEXPORT :: TSAT12 
!DEC$ ATTRIBUTES VALUE :: N 
INTEGER, INTENT(IN) :: N 
REAL, INTENT(IN) :: P(N) 
REAL :: TSAT12 
    ! Examle calculation 
    TSAT12 = SQRT(DOT_PRODUCT(P,P)) 
RETURN 
END FUNCTION 

con llamar C# código

class Program 
{ 
    [DllImport("calc.dll")] 
    static extern float TSAT12(float[] P, int N); 

    static void Main(string[] args) 
    { 
     float[] p2=new float[] { 0.5f, 1.5f, 3.5f }; 
     float t2=TSAT12(p2, p2.Length); 
     //returns 3.84057283 
    } 
} 
+0

Gracias, hombre, esto es exactamente lo que quería. – workoverflow

+0

Gracias, hombre, me salvaste la vida, mañana tengo una fecha límite y tu respuesta fue todo lo que busqué. Falta una cosa 'usando System.Runtime.InteropServices;' – workoverflow

1

Usted podría utilizar P/Invoke. Aquí está an article que proporciona un ejemplo. En cuanto a la compilación de su código Fortran en una DLL no administrada, puede create a DLL Project en CVF.

+0

Considere agregar una decoración '! DEC $ ATTRIBUTES VALUE :: P' que evita tener que usar argumentos' ref' y pasa por valor. Entonces en lugar de 'foo (ref p)' llama con 'foo (p)'. – ja72

Cuestiones relacionadas