如何编组c#中的集合以传递给本机(C++)代码

Jam*_*ame 5 c# c++ pinvoke marshalling

我正在进行企业应用程序开发.整个应用程序是用c ++开发的,除了用c#开发的用户界面,现在是时候用c ++代码连接用户界面了.经过详细研究,我选择PInvoke才能这样做.一切都是成功的,我遇到的唯一情况是如何将集合传递给C++代码.例如:

C#侧码

List<string> lst = new List<string>();
lst.Add("1");
lst.Add("2");
lst.Add("3");
lst.Add("4");
Run Code Online (Sandbox Code Playgroud)

C++边码

std::vector<std::string> vStr;
Run Code Online (Sandbox Code Playgroud)

现在我如何将lst传递给本机C++代码

Pet*_*ene 5

正如 mzabsky 提到的,您无法封送这些类型。但是,您可以编组数组:

理论上的 C++ 导出:

extern "C" __declspec(dllexport) void __stdcall Foo(wchar_t const* const* values, int length)
{
    // Check argument validity...

    // If you really need a vector
    std::vector<std::wstring> vStr(values, values + length);

    //...
}
Run Code Online (Sandbox Code Playgroud)

P/Invoke 签名:

[DllImport("foo.dll")]
static extern void Foo([MarshalAs(UnmanagedType.LPArray, ArraySubType=UnmanagedType.LPWStr)] string[] values, int length);
Run Code Online (Sandbox Code Playgroud)

来自 C# 的调用:

Foo(lst.ToArray(), lst.Count);
Run Code Online (Sandbox Code Playgroud)

请注意,我在这里使用 std::wstring ;您可以使用 char 代替 wchar_t,使用 LPStr 代替 LPWStr,使用 std::string 代替 std::wstring。

请注意,这将从列表中分配一个数组,然后向量将复制数组的内容。如果原始列表很小,那么这个问题应该可以忽略不计。

编辑:修复标记(< 和 >)。