我在C项目中设置了以下测试功能:
__declspec(dllexport) int test(char *str, int strlen){
char* h = "Hello";
int length = 5;
for(int i = 0; i < length; i++){
str[0] = h[0];
}
return strlen;
}
在我的C#项目中,我声明方法如下:
[DllImport("solver.dll", CharSet = CharSet.Unicode ,CallingConvention = CallingConvention.Cdecl)]
public static extern int test(StringBuilder sol, int len);
我尝试在我的项目中使用它:
StringBuilder sol = new StringBuilder(15);
int t = test(sol, sol.Capacity);
string str = sol.ToString();
我想通过&#34;你好&#34;回到C#代码作为测试,但是当我运行代码时StringBuilder保持为空,即使15作为长度传递给C函数,当C函数返回长度时它返回&#39; random&# 39;很多像125822695.我错过了什么?
答案 0 :(得分:3)
许多问题:
CharSet.Unicode
,但在非托管代码中使用ANSI
。strlen
的值。对于函数返回的值,无法通过您提供的代码进行解释。为了解释这个问题,我们需要查看一些问题。
当我们看到这些问题时非常常见,非托管代码明显被破坏了。编写正确的p / invokes来纠正非托管代码是很困难的。尝试同时调试p / invoke和非托管代码要困难得多。首先在非托管设置中测试非托管代码。只有当你确信它是正确的时候才开始写你的p / invoke。