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

时间:2011-03-10 10:50:57

标签: c# c++ pinvoke marshalling

有什么方法可以让我们从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

5 个答案:

答案 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样式的charwchar_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。