2011-01-12 36 views
1


我被給了一個FORTRAN程序,我必須爲它編寫C#GUI(不要問爲什麼)。這個程序已經有了FORTRAN GUI,所以我把所有的計算子程序都放到了FORTRAN dll中。這個DLL是由4個文件構成的:一個靜態庫,一個FORTRAN77文件(.for)和兩個FORTRAN90文件(.f90)。我已經把所有的子程序從C#代碼中調用到EXPORT.f90中。
Fortran代碼:C#在Fortran dll中找不到入口點

MODULE MYVAR 
    REAL*8 LK 
    COMMON LK 
END MODULE  

SUBROUTINE SETLK(NEWLK) 
    !DEC$ ATTRIBUTES DLLEXPORT :: SETLK 
    USE MYVAR 
    REAL*8 NEWLK 
    LK = NEWLK 
END 

SUBROUTINE GETLK(LKOUT) 
    !DEC$ ATTRIBUTES DLLEXPORT :: GETLK 
    USE MYVAR 
    REAL*8, INTENT(OUT):: LKOUT 
    LKOUT = LK 
END 

現在我想要打電話給他們在C#中

[DllImport(@"MYDLL.dll", CharSet = CharSet.Ansi, 
CallingConvention = CallingConvention.Cdecl, 
EntryPoint="SETLK")] 
public static extern void SETLK(ref double NEWLK); 

[DllImport(@"MYDLL.dll", CharSet = CharSet.Ansi, 
CallingConvention = CallingConvention.Cdecl, 
EntryPoint="GETLK")] 
public static extern void GETLK(out double LKOUT); 


static void Main(string[] args) 
{ 
    double d1 = 1.234; 
    SETLK(ref d1); 
    double d2; 
    GETLK(out d2); 
    Console.WriteLine(d2.ToString()); 
} 

我得到EntryPointNotFoundException 「無法找到 'MYDLL.DLL' 切入點 'SETLK'」。我必須做些什麼才能使它工作?
Thanx

回答

1

This thread建議你需要一個DEF文件聲明函數的出口(就像在本地Windows編程中使用到)

+0

謝謝。它的工作,但我仍然無法得到爲什麼我必須寫EXPORT _SETLK @ 4而不是EXPORT SETLK。如果只是SETLK,我會得到3個警告:1.找不到符號「SETLK」的唯一匹配; 2. _SETLK在。\ Debug \ EXPORT.obj中定義; 3. _SETLK @ 4在。\ Debug \ EXPORT.obj中定義;那會導致錯誤 – 2011-01-12 18:28:37

1

用像PE Explorer這樣的工具來查看你的dll。它會告訴你什麼確切的功能導出。

+0

OK,感謝名單。它在我的dll中顯示沒有導出的函數。所以現在的問題是讓這些子程序導出 – 2011-01-12 16:21:48

相關問題