c# - 将字符串从 C 函数传递给 C#

标签 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();

我想将“Hello”作为测试传递回 C# 代码,但是当我运行代码时,StringBuilder 保持为空,即使将 15 作为长度传递给 C 函数,当 C 函数返回长度,它返回一个“随机”大数,如 125822695。我错过了什么?

最佳答案

一些问题:

  1. 您在 C# 中声明 CharSet.Unicode,但在非托管代码中使用 ANSI
  2. 你只写第一个字符。
  3. 您忽略传递给函数的 strlen 的值。
  4. 您不要尝试编写空终止符。

至于函数返回的值,您提供的代码无法解释。为了解释这一点,我们需要了解您的问题中缺少的内容。

当我们看到这些问题时,非托管代码显然已损坏是很常见的。编写正确的 p/invokes 来纠正非托管代码已经够难的了。尝试同时调试 p/invoke 和非托管代码要困难得多。首先在非托管设置中测试您的非托管代码。只有当您确信它是正确的时,您才应该着手编写您的 p/invoke。

关于c# - 将字符串从 C 函数传递给 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40104453/

相关文章:

c++ - iperf3 的 C 编译问题

c# - 使用多个指针在 C# 中编码 native .dll

.net - 针对 "Any CPU"的 .NET 应用程序能否在多个环境中使用 P/Invoke 调用?

c# - Pinvoke DeviceIoControl 参数

c# - 字符串连接与字符串生成器追加

c# - 如何在运行时编译 C 代码并使用它的函数

c# - 使用 linq 在某个日期范围内每月排名前 5 的客户端性能

c++ - curl_easy_setopt(curl, CURLOPT_POSTFIELDS, msg_out);重复内存?

c# - CloudConfigurationManager.GetSetting 在生产中返回空字符串?

c# - 为什么 C# 编译器可以 "see"静态属性,而不是实例方法,在未引用的 DLL 中的类?