从 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 时出现 System.AccessViolationException
在 C# 中调用 Gmail 服务 API 时出现 System.Net.Http.HttpRequestException