【问题标题】:C# can't find an entry point in Fortran dllC# 在 Fortran dll 中找不到入口点
【发布时间】:2011-06-07 22:36:16
【问题描述】:


我得到了一个工作的 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'”。我必须做些什么才能让它发挥作用?
谢谢

【问题讨论】:

    标签: c# fortran dllexport


    【解决方案1】:

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

    【讨论】:

    • 谢谢。它起作用了,但我仍然不明白为什么我必须写 EXPORT _SETLK@4 而不是 EXPORT SETLK。如果只是 SETLK,我会收到 3 个警告: 1. 找不到符号“SETLK”的唯一匹配项; 2. .\Debug\EXPORT.obj 中定义的_SETLK; 3. .\Debug\EXPORT.obj 中定义的_SETLK@4;导致错误
    【解决方案2】:

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

    【讨论】:

    • 好的,谢谢。它在我的 dll 中显示没有导出的函数。所以现在的问题是让那些子程序导出
    猜你喜欢
    • 2015-07-19
    • 1970-01-01
    • 2012-12-08
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多