将C函数中的字符串传递给C#

时间:2016-10-18 09:27:49

标签: c# c pinvoke

我在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.我错过了什么?

1 个答案:

答案 0 :(得分:3)

许多问题:

  1. 您在C#中说明CharSet.Unicode,但在非托管代码中使用ANSI
  2. 你只写第一个字符。
  3. 您忽略传递给该函数的strlen的值。
  4. 您不会尝试编写空终止符。
  5. 对于函数返回的值,无法通过您提供的代码进行解释。为了解释这个问题,我们需要查看一些问题。

    当我们看到这些问题时非常常见,非托管代码明显被破坏了。编写正确的p / invokes来纠正非托管代码是很困难的。尝试同时调试p / invoke和非托管代码要困难得多。首先在非托管设置中测试非托管代码。只有当你确信它是正确的时候才开始写你的p / invoke。