2012-04-25 44 views
7

Tôi có một chức năng trong một thực thi Fortran và tôi cần phải làm cho nó một tập tin dll vì vậy tôi có thể gọi đó là chức năng từ một chương trình C#Làm dll Fortran và gọi nó từ C#

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

P là một phao và chức năng trả về một phao

Điều ở đây mà tôi không biết bất cứ điều gì trong fortran cũng không gọi dlls từ C#, vì vậy hãy giải thích thêm một chút.

Tôi đang sử dụng Compaq Visual Fortran và C# 2008.

Cảm ơn bạn đã dành thời gian.

(Nếu bạn thích bạn có thể xem toàn bộ mã Here [Đó là một chương trình để tính toán nước và hơi nước properties])

+0

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

+0

Vui lòng bao gồm cách được định nghĩa 'P' và hàm nào trả về theo loại và thứ nguyên mảng. – ja72

+0

Bạn có biết cách tạo DLL bằng trình biên dịch Fortran không? – dsolimano

Trả lời

9

Dưới đây là ví dụ sử dụng phao chính xác đơn.

thư viện Fortran chứa:

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 

Với chức năng gọi điện thoại

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

Tương tự cho một mảng (phải khai báo kích thước)

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 

với gọi C# đang

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

Cảm ơn người đàn ông, đây là chính xác những gì tôi muốn. – workoverflow

+0

Cảm ơn người đàn ông bạn đã cứu mạng tôi, tôi có thời hạn vào ngày mai và câu trả lời của bạn là mọi thứ tôi tìm kiếm. Một điều còn thiếu 'using System.Runtime.InteropServices;' – workoverflow

1

Bạn có thể sử dụng P/Invoke. Đây là an article cung cấp một ví dụ. Theo như biên dịch mã Fortran của bạn thành một DLL không được quản lý, bạn có thể create a DLL Project trong CVF.

+0

Cân nhắc thêm trang trí '! DEC $ ATTRIBUTES VALUE :: P' để tránh phải sử dụng các đối số' ref' và truyền theo giá trị. Vì vậy, thay vì 'foo (ref p)' bạn gọi với 'foo (p)'. – ja72

Các vấn đề liên quan