我正在从事企业应用程序开发。整个应用程序都是用 C++ 开发的,除了 UI 是用 C# 开发的,现在是时候将 UI 与 C++ 代码挂钩了。经过详细研究,我选择了 PInvoke 来实现这一点。
一切都很成功,我唯一遇到的问题是如何将集合传递给 C++ 代码。
例如:
C# 边代码
List<string> lst = new List<string>();
lst.Add("1");
lst.Add("2");
lst.Add("3");
lst.Add("4");
C++ 边代码
std::vector<std::string> vStr;
现在我如何将 lst 传递给本机 C++ 代码
正如 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);
//...
}
P/调用签名:
[DllImport("foo.dll")]
static extern void Foo([MarshalAs(UnmanagedType.LPArray, ArraySubType=UnmanagedType.LPWStr)] string[] values, int length);
来自 C# 的调用:
Foo(lst.ToArray(), lst.Count);
请注意,我在这里使用 std::wstring ;您可以使用 char 代替 wchar_t,使用 LPStr 代替 LPWStr,使用 std::string 代替 std::wstring。
请注意,这将从列表中分配一个数组,然后向量将复制该数组的内容。如果原始列表的大小很小,那么这个问题应该可以忽略不计。
编辑:修复标记(< 和 >)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)