【问题标题】:How to Get array of string from Native Code(C++) in Managed Code(C#)如何在托管代码(C#)中从本机代码(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#中的集合,不胜感激

//詹姆士

【问题讨论】:

    标签: c# c++ pinvoke marshalling


    【解决方案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 的安全数组。

          【讨论】:

            猜你喜欢
            • 2012-11-19
            • 2021-12-03
            • 1970-01-01
            • 2012-01-26
            • 1970-01-01
            • 2017-09-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多