【问题标题】:Unable to Find an Entry Point (cpp)无法找到入口点 (cpp)
【发布时间】:2010-12-05 10:15:43
【问题描述】:

这是一个与this one类似的问题。

我想从 C++ 中导出一个简单的函数,由 C# 通过 PInvoke 调用。这是我的函数定义:

 int fnValue()
{
    return 42;
}

这是.h文件中的导出定义:

__declspec(dllexport)  int fnValue();

这就是我 PInvoke 函数的方式:

    [DllImport("WhatDll.dll")]
    public static extern int fnValue();

很简单,对吧?但我有一个

System.EntryPointNotFoundException : 无法找到名为的入口点 DLL“WhatDll.dll”中的“fnValue”

我使用 dumpbin 检查 WhatDll 里面的内容,这就是我所拥有的:

00000000 特性 4CFB5C95 时间日期戳 Sun Dec 05 17:34:13 2010 0.00 版本 1 个序数基数 4个功能 4个名字

序号提示 RVA 名称

   1    2 00011014 ?fnValue@@YAHXZ = @ILT+15(?fnValue@@YAHXZ)

注意函数名fnValue后面有一些乱码。

这很令人费解。有什么想法吗?

【问题讨论】:

    标签: .net c++ interop


    【解决方案1】:

    试着写

    extern "C"__declspec(dllexport)  int fnValue();
    

    【讨论】:

    • @Thanks,为什么我需要在前面extern "C"
    • 如果前面没有 extern "C",C++ 编译器会将“名称修饰”或“名称修饰”应用于函数名称,以便将更多语义信息从编译器传递给链接器。 extern "C" 告诉 C++ 编译器避免破坏对标识符的引用。
    【解决方案2】:

    如果您使用 c++ 编译器进行编译,请使用 extern "C" 导出或添加 .def 文件来指定导出名称。 另外__stdcall 可能是必要的

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-22
      • 2014-03-04
      • 1970-01-01
      • 2012-12-25
      相关资源
      最近更新 更多