1


我得到了一个工作的 FORTRAN 程序,我必须为它编写 C# GUI(不要问为什么)。这个程序已经有了 FORTRAN GUI,所以我把所有的计算子程序都提取出来放到 FORTRAN dll 中。该 dll 由 4 个文件构成:一个静态库、一个 FORTRAN77 文件(.for)和两个 FORTRAN90 文件(.f90)。我已将所有应该从 C# 代码中调用的子例程放入 EXPORT.f90。
FORTRAN 代码:

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'”。我该怎么做才能让它工作?
谢谢

4

2 回答 2

1

使用 PE 资源管理器之类的工具查看您的 dll。它会告诉您导出了哪些确切的函数。

于 2011-01-12T16:11:22.867 回答
1

该线程建议您需要一个 .def 文件来声明函数导出(就像您在本机 Windows 编程中使用的那样)

于 2011-01-12T17:10:50.133 回答