我有一个看起来像这样的C ++函数
__declspec(dllexport) int ___stdcall RegisterPerson(char const * const szName)
{
std::string copyName( szName );
// Assign name to a google protocol buffer object
// Psuedo code follows..
Protobuf::Person person;
person.set_name(copyName);
// Error Occurs here...
std::cerr << person->DebugString() << std::endl;
}
相应的C#代码如下所示......
[DllImport(@"MyLibrary.dll", SetLastError = true)]
public static unsafe extern int RegisterPerson([MarshalAs(UnmanagedType.LPTStr)]string szName)
不确定为什么这不起作用。我的C ++库被编译为具有MultiByte编码的多线程DLL。
任何帮助将不胜感激。我看到这是一个在线的常见问题,但没有答案让我找到解决问题的方法。
我能够用我的DLL导出的相同函数参数成功调用另一个导出函数,并且一个正常工作。这个“注册人”功能比其他导出功能稍长,但由于某些原因不起作用。
答案 0 :(得分:1)
首先,C ++函数的定义错过extern "C"
,如果没有指定,由于C ++名称混合,Pinvoke无法找到该函数。
作为C#中的define,指定UnmanagedType.LPTStr,默认情况下,它将是宽字符,但C ++函数RegisterPerson中的参数是char,您应该将其更改为UnmanagedType.LPStr。