有什么方法可以让我们从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#中的集合,并且将非常感谢帮助
// Jame S
答案 0 :(得分:4)
有很多方法可以解决这个问题,但它们都比你现在的方式复杂得多。
将用C ++分配的字符串传递给C#的最简单方法可能是BSTR
。这允许您在C ++中分配字符串,并让C#代码解除分配。这是你面临的最大挑战和编组,BSTR
解决了这个问题。
由于您需要一个字符串列表,您可以将其更改为将其编组为BSTR
数组。这是一种方式,它可能是我将采取的路线,但还有许多其他方法。
答案 1 :(得分:3)
尝试改为使用
C#部分
[DllImport("MyDLL.dll")]
private static extern void GetCollection(ref string[] array, uint size);
C ++部分
void GetCollection(string * array , uint size)
并在GetCollection函数中填充数组
答案 2 :(得分:3)
我认为您必须将其转换为更友好的C#,例如C样式的char
或wchar_t
C样式字符串数组。 Here您可以找到std::string
封送的示例。 here你会找到关于如何编组std::vector
的讨论。
答案 3 :(得分:1)
我建议你把它改成阵列然后编组。在PInvoke中编组数组要容易得多,事实上我不相信C ++类可以编组。
答案 4 :(得分:1)
我会在C ++中返回BSTR的SAFEARRAY,并将其编组为C#中的字符串数组。您可以在此处How to build a SAFEARRAY of pointers to VARIANTs?或http://www.roblocher.com/whitepapers/oletypes.aspx查看如何使用BSTR的safearray。