将字符串的引用从 C# 传递给 C++ 函数

Posted

技术标签:

【中文标题】将字符串的引用从 C# 传递给 C++ 函数【英文标题】:Pass a reference of string from C# to C++ function 【发布时间】:2014-06-18 08:06:04 【问题描述】:

我有一个 C++ 库,并在其中编写了一些函数。 此函数必须返回一个整数和一个字符串。 (2 个输出),我将从我的 C# 程序中调用此函数。 这是我的 C++ 代码:

extern "C"

    __declspec(dllexport)   UINT Read(OUT char* Temp )
    
    .....
      
  

这是我在 ImportDll 类中的 C# 代码:

[DllImport("Library.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern uint Read(char[] temp);  

在我的表格中我有这个:

char[] str = new char[256];  
ImportDLL.Read(str);  

它正确返回一个 Int 但字符串结果(str 数组)完全为零(\0)! 我的代码有什么问题? 谢谢。

【问题讨论】:

为什么要用char[],可以用string。 如果你有dll代码,那么你可以调试“读取”函数,看看函数内部发生了什么。 【参考方案1】:

对 Matthew Watson 的回答有一个补充:您还需要将 stringbuilder 参数编组为 LPSTR (char *),例如

[DllImport("Library.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern uint Read([MarshalAs(UnmanagedType.LPStr)] StringBuilder temp);

【讨论】:

【参考方案2】:

由于返回值为 OUT,我假设它是由 C++ 方法创建的。

在这种情况下,您可能需要将 StringBuilder 传递给它:

[DllImport("Library.dll", CallingConvention = CallingConvention.Cdecl, CharSet=CharSet.Unicode)]
public static extern uint Read(StringBuilder temp);  

请注意,您还应该指定字符集,这取决于您的 C++ 代码使用的字符编码 - ANSI 或 Unicode。

要调用它,创建一个足够大小的新 StringBuilder 并将其传递给Read(),然后在Read() 返回后使用 StringBuilder.ToString() 检索字符串。

如果 C++ 函数需要一个特定大小的字符串缓冲区,则需要创建至少为该大小的 StringBuilder,例如:

const int BUFFER_SIZE = 128;
var sb = new StringBuilder(BUFFER_SIZE);
Read(sb);
var result = sb.ToString();

注意:如果不了解 C++ 函数的细节,很难说这是否真的是正确的解决方案。可能你只需要传递一个字符串。

【讨论】:

非常感谢,这很有帮助,但正确答案是:[MarshalAs(UnmanagedType.LPStr)] StringBuilder temp

以上是关于将字符串的引用从 C# 传递给 C++ 函数的主要内容,如果未能解决你的问题,请参考以下文章

将 C# 字符串传递给 C++,并将 C++ 结果(字符串、char*.. 任何)传递给 C#

如何将 COM 对象的 C# 引用传递给 C++ DLL

将 C++ 字符串传递给 C# 函数

将 C# 字符串数组传递给 C++

使用 Dllimport 将一个非常大的字符串作为字节数组从 C++ 传递到 C#

通过引用从 c# 将 char** 传递给非托管 C++