c++ 中是如下定义的
extern "C" __declspec(dllexport) int test(int id, char *retstr, int *strLen);
其中 retstr 参数会在C++代码里修改后返回给调用者,后面的strLen为字符串的实际长度。
C#该如何调用呢?
按正常的网上说法,char* 是可以对应到string,
[DllImport("test.dll", EntryPoint = "test", CallingConvention = CallingConvention.Cdecl)]
public extern static int test(int engineId, string retStr, ref int strLen);
但是如果使用char*的话,就会报内存地址不能访问的错误,经过查找,需要使用IntPtr才能正常返回。
[DllImport("test.dll", EntryPoint = "test", CallingConvention = CallingConvention.Cdecl)]
public extern static int test(int engineId, IntPtr retStr, ref int strLen);
调用:
IntPtr retStrPtr= Marshal.AllocHGlobal(1024);
调用返回:
string retStr = Marshal.PtrToStringAnsi(retStrPtr,strLen);
至此,可以正常获取返回数据!