我用c ++创建了dll,想用c#调用它的函数.我有一个错误,如果函数,程序调用,返回字符串. Dll代码:
#include <string>
using namespace std;
#define EXPORT_API extern "C" __declspec(dllexport)
EXPORT_API void DllFunc()
{
MessageBoxA(0,"DDL box", "Yeah!", 0);
}
EXPORT_API string DllFuncStr()
{
return "testStr";
}
Run Code Online (Sandbox Code Playgroud)
C#应用程序代码:
[DllImport("dllka.dll")]
static extern void DllFunc();
[DllImport("dllka.dll")]
static extern string DllFuncStr();
private void btnStart_Click(object sender, RoutedEventArgs e)
{
DllFunc();
string str = DllFuncStr();
}
Run Code Online (Sandbox Code Playgroud)
"DllFunc();" - 效果不错,但在线"string str = DllFuncStr();" 我有一个错误:
运行时遇到了致命错误.错误的地址位于0x5e6dceca,位于线程0x16b0上.错误代码是0xc0000005.此错误可能是CLR中的错误,也可能是用户代码的不安全或不可验证部分中的错误.此错误的常见来源包括COM-interop或PInvoke的用户编组错误,这可能会破坏堆栈.
字符串类型有什么问题?如何解决这个问题?
你不能将std :: string从C++编组到C#.而是使用以StringBuilder编组的以零结尾的字符串,或返回BSTR.
BSTR方法非常简单.如果您更喜欢以零结尾的字符串,那么请在Web上查找来自Win32 API的示例P/Invokes,例如GetWindowText().
您正在使用cdecl调用约定从C++导出,但在C#代码中使用stdcall.在对数据类型进行排序后,您需要将这些匹配起来.你使用哪个都没关系,只要它在两端都是一样的.
您还需要了解C++代码使用char(8位编码)和C#使用Windows本机UTF-16这一事实.
如果是我,我会用BSTR来做,因为我在另一个问题的答案中概述了.