制作Fortran DLL并从C#调用它

时间:2012-04-25 14:22:36

标签: c# dll fortran

我在Fortran可执行文件中有一个函数,我需要把它变成一个dll文件,所以我可以从C#程序中调用它的函数

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

P是一个浮点数,函数返回一个浮点数

在这里,我对fortran一无所知,也没有用C#调用dll,所以请再解释一下。

我正在使用Compaq Visual Fortran和C#2008。

感谢您的时间。

(如果你愿意,你可以看到完整的代码Here [这是一个计算水和蒸汽属性的程序])

2 个答案:

答案 0 :(得分:9)

以下是使用单精度浮动的示例。

Fortran库包含:

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

使用调用功能

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
    } 
 }

类似于数组(必须声明大小)

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

调用C#代码

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
    } 
 }

答案 1 :(得分:1)

你可以使用P / Invoke。这里的an article提供了一个例子。至于将Fortran代码编译为非托管DLL,您可以在CVF中create a DLL Project