如何在托管代码(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# 更友好的东西,例如 char
或 wchar_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++)获取字符串数组的主要内容,如果未能解决你的问题,请参考以下文章