从 C# 调用 C++ 代码时出现 System.EntryPointNotFoundException

Posted

技术标签:

【中文标题】从 C# 调用 C++ 代码时出现 System.EntryPointNotFoundException【英文标题】:System.EntryPointNotFoundException when calling C++ code from C# 【发布时间】:2013-08-20 14:58:25 【问题描述】:

//------------------------------------- C# 代码 ------ ------------------------------

[DllImport("MarshallStringsWin32.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
extern static void Test([MarshalAs(UnmanagedType.AnsiBStr)] out String str);

[DllImport("MarshallStringsWin32.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
extern static void FreeString([MarshalAs(UnmanagedType.AnsiBStr)] String str);

static void Main(string[] args)

    String str;
    Test(out str);
    FreeString(str);

//---------------------------------------- C++ 代码 ------ ------------------------------

void Test(__out BSTR* str)

   const std::string stdStr = "The quick brown fox jumps over the lazy dog";
   _bstr_t bstrStr = stdStr.c_str();
   *str = bstrStr.copy();


void FreeString(BSTR str)

   SysFreeString(str);

调用 Test() 时出现 System.EntryPointNotFoundException。有人会知道我做错了什么吗?这是编组字符串的正确方法吗?

【问题讨论】:

【参考方案1】:

可能需要在头文件中添加c++代码的代码:

 extern "C" void __declspec(dllexport) FreeString(BSTR str);

 extern "C" void __declspec(dllexport) Test(BSTR* str);

【讨论】:

【参考方案2】:

这几乎可以肯定是因为 C# 无法将您的方法 Test 的名称映射到本机代码中的 Test 方法。尝试为该方法指定 EntryPoint="Test" 属性,如下所示:

[DllImport("MarshallStringsWin32.dll", EntryPoint="Test", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
extern static void Test([MarshalAs(UnmanagedType.AnsiBStr)] out String str);

【讨论】:

以上是关于从 C# 调用 C++ 代码时出现 System.EntryPointNotFoundException的主要内容,如果未能解决你的问题,请参考以下文章

尝试从 C# 调用 C++ dll 时出现格式不正确的异常

将数组移交给 C# 中动态加载的 C++ DLL 时出现 System.AccessViolationException

在 C# 中调用 Gmail 服务 API 时出现 System.Net.Http.HttpRequestException

C#:加载 C++ DLL 时出现问题

将 C++ 结构编组到 C# 类时出现 AccessViolationException

使用 C# 访问非托管 C++ DLL 时出现 AccessViolationException