今天在用C#开发软件,调用的C++写的DLL,DLL接口返回的数据是char*类型,导致C#程序不断的崩溃,最终找到了解决办法。
声明DLL接口调用
这里涉及到以下几点:
- 设置DLL调用的编码,C#默认是Unicode的,C++默认是ANSI的,所以需要增加:CharSet = CharSet.Ansi
- 增加调用约定,否则会报错误:CallingConvention = CallingConvention.Cdecl
- C++的返回类型为char*是一个指针,所以C#要设置返回类型为:IntPtr
其他信息: 对 PInvoke 函数“xxxx”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。
其他信息: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
C#代码如下:
//声明DLL接口
[DllImport("test.dll", CharSet = CharSet.Ansi , CallingConvention = CallingConvention.Cdecl)]
private static extern IntPtr ApiName(string data, string key);
//调用DLL接口
IntPtr d = ApiName("a","b");//接受返回的指针
string data = Marshal.PtrToStringAnsi(d);//指针读取数据
C++的DLL接口代码如下:
char * DLL_EXPORT ApiName(const char* a,const char* b);