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++代码
正如 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。
请注意,这将从列表中分配一个数组,然后向量将复制数组的内容。如果原始列表很小,那么这个问题应该可以忽略不计。
编辑:修复标记(< 和 >)。
| 归档时间: |
|
| 查看次数: |
8920 次 |
| 最近记录: |