如何在托管代码(C#)中从本机代码(C++)获取字符串数组

Posted

技术标签:

【中文标题】如何在托管代码(C#)中从本机代码(C++)获取字符串数组【英文标题】:How to Get array of string from Native Code(C++) in Managed Code(C#) 【发布时间】:2011-03-10 10:50:57 【问题描述】:

有什么方法可以让我们从c++到c#获取字符串集合

C#代码

[DllImport("MyDLL.dll")]
private static extern List<string> GetCollection();
public static List<string> ReturnCollection()

    return GetCollection();

C++ 代码

std::vector<string> GetCollection()

std::vector<string> collect;
return collect;

以上代码仅供示例,主要目的是从C++中获取C#中的集合,不胜感激

//詹姆士

【问题讨论】:

【参考方案1】:

有很多方法可以解决这个问题,但它们都比您目前拥有的要复杂得多。

将 C++ 中分配的字符串传递给 C# 的最简单方法可能是使用 BSTR。这允许您在 C++ 中分配字符串,并让 C# 代码释放它。这是您面临和编组的最大挑战,BSTR 轻松解决了它。

由于您想要一个字符串列表,您可以更改为将其编组为BSTR 的数组。这是一种方式,这可能是我会走的路线,但还有很多其他的方法。

【讨论】:

【参考方案2】:

我认为您必须将其转换为对 C# 更友好的东西,例如 charwchar_t C 风格字符串的 C 样式数组。 Here 您可以找到 std::string 编组的示例。和here 你会发现关于如何编组std::vector 的讨论。

【讨论】:

【参考方案3】:

尝试改用

C#部分

[DllImport("MyDLL.dll")]
private static extern void GetCollection(ref string[] array, uint size);

C++部分

void GetCollection(string * array , uint size)

在GetCollection函数中填充数组

【讨论】:

那行不通。想想谁分配和解除分配字符串。【参考方案4】:

我建议你把它改成数组然后编组。在 PInvoke 中编组数组要容易得多,实际上我不相信 C++ 类类可以编组。

【讨论】:

【参考方案5】:

我会在 C++ 中返回 BSTR 的 SAFEARRAY,并在 C# 中将其编组为字符串数组。您可以在How to build a SAFEARRAY of pointers to VARIANTs? 或http://www.roblocher.com/whitepapers/oletypes.aspx 看到如何使用 BSTR 的安全数组。

【讨论】:

以上是关于如何在托管代码(C#)中从本机代码(C++)获取字符串数组的主要内容,如果未能解决你的问题,请参考以下文章

(C++/CLI) 如何在 C++ CLI 中获取从本机代码到托管代码的回调?

托管 c++ 库,它是如何工作的?

如何从非托管 C++ 代码获取结构化列表值到 C#?

我们如何在 C# 中从 C++ DLL 中获取所有方法?

如何从 C# 调用 C++ 类

调用本机代码的多线程托管应用程序