我在 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();
我想将“Hello”作为测试传递回 C# 代码,但是当我运行代码时,StringBuilder 保持为空,即使将 15 作为长度传递给 C 函数,当 C 函数返回长度,它返回一个“随机”大数,如 125822695。我错过了什么?
最佳答案
一些问题:
- 您在 C# 中声明
CharSet.Unicode
,但在非托管代码中使用ANSI
。 - 你只写第一个字符。
- 您忽略传递给函数的
strlen
的值。 - 您不要尝试编写空终止符。
至于函数返回的值,您提供的代码无法解释。为了解释这一点,我们需要了解您的问题中缺少的内容。
当我们看到这些问题时,非托管代码显然已损坏是很常见的。编写正确的 p/invokes 来纠正非托管代码已经够难的了。尝试同时调试 p/invoke 和非托管代码要困难得多。首先在非托管设置中测试您的非托管代码。只有当您确信它是正确的时,您才应该着手编写您的 p/invoke。
关于c# - 将字符串从 C 函数传递给 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40104453/