2012-04-25 39 views
7

調用它,我有一個Fortran可執行文件的功能,我需要使它成爲一個dll文件,這樣我就可以調用它的功能從C#程序製作Fortran的DLL和C#

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

P是float和該函數返回一個浮點數

這裏的東西,我不知道什麼在Fortran中,也沒有從C#調用dll,所以請多解釋一下。

我使用的是康柏的Visual Fortran和C#2008

謝謝您的時間。

(如果你喜歡,你可以看到完整的代碼Here [這是一個程序來計算水和蒸汽的性質])

+0

http://support.microsoft.com/kb/123841? – SixOThree 2012-04-25 14:27:56

+0

請包括如何定義'P',以及函數返回的類型和數組維數。 – ja72 2012-04-25 14:29:15

+0

是否知道如何使用Fortran編譯器製作DLL? – dsolimano 2012-04-25 14:29:37

回答

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

謝謝你,這正是我想要的。 – workoverflow 2012-04-25 16:48:21

+0

感謝你拯救了我的生命,明天我有一個最後期限,你的回答就是我尋找的一切。 有一件事缺少'使用System.Runtime.InteropServices;' – workoverflow 2012-04-26 03:07:05

1

你可以使用的P/Invoke。這裏提供了一個例子an article。至於編譯Fortran代碼到非託管DLL中,您可以在CVF中使用create a DLL Project

+0

考慮添加一個'!DEC $ ATTRIBUTES VALUE :: P'裝飾,避免使用'ref'參數並按值傳遞。因此,而不是'foo(ref p)'你用'foo(p)'調用。 – ja72 2012-04-25 14:44:46