将 char * 参数传递给 C# 函数

Posted

技术标签:

【中文标题】将 char * 参数传递给 C# 函数【英文标题】:Passing char * parameter to C# function 【发布时间】:2012-12-02 10:06:11 【问题描述】:

C++ win32dll1.dll:

extern "C" __declspec(dllexport) int getSerialNumber(char* outs)

    char s[2];
    s[0]='0';
    s[1]='1';

    for(int i=0; i < 2; ++i)
        outs[i] = s[i];
    
    return 1;

C#:

[DllImport("win32dll1.dll")]
public unsafe static extern int getSerialNumber(char* ss);

无法在函数中传递s

char[] s = new char[2];
getSerialNumber(s);

这不应该吗?为什么或为什么不?

【问题讨论】:

可能重复 ***.com/questions/683013/… ***.com/questions/2179270/… ***.com/questions/4455234/… 【参考方案1】:

你应该在声明中使用StringBuilder

[DllImport("win32dll1.dll")]
public unsafe static extern int getSerialNumber(StringBuilder s);

CLR 会自动将其转换为 C++ char*,调用该函数,然后将结果转换回来并将其存储在 StringBuider 中。

这样称呼它:

var sb = new StringBuilder(2);
getSerialNumber(sb);

数字指定字符的初始容量。在这个例子中,它只有 2 个字符;如果 C++ 代码写的比这多,你的应用就会崩溃。

【讨论】:

我不认为 OP 想要 一个字符串。查看问题中提供的示例数据,我认为byte[] 会更合适。 @KonradRudolph - 在这种情况下,他们可以将String 转换为byte[]。谁知道作者想要他们的问题是模糊的。 问题中的示例清楚地把characters放入了一个名为getSerialNumber的方法中的数组中,这显然意味着要检索一个文本字符串。跨度>

以上是关于将 char * 参数传递给 C# 函数的主要内容,如果未能解决你的问题,请参考以下文章

怎么将可变参数的函数的参数传递给另一个可变参数的函数

将整数参数传递给 C 中的主函数

C#将方法作为参数传递给另一个方法[重复]

将其他参数传递给gtk函数

在 Visual Studio 中通过 C# 将参数传递给 Mac 上的终端

对象作为参数传递给另一个类,通过值还是引用?