将引用类型从 C++ 编组到 C#
Posted
技术标签:
【中文标题】将引用类型从 C++ 编组到 C#【英文标题】:Marshalling reference-types from C++ to C# 【发布时间】:2009-04-24 20:23:47 【问题描述】:我想从 C# 调用以下 C++ 函数(由 DLL 导出):
void createVm(
const jace::VmLoader& loader,
const jace::OptionList& options,
bool ignoreUnrecognized = true );
我找到了将原语从 C++ 编组到 C# 的文档,但我不确定如何处理引用类型或非原始类型,例如 VmLoader 或 OptionList(它们都是类)。我正在尝试用 C# 层包装 C++ API,将实际方法实现委托给底层 C++ 代码。
有什么想法吗?
【问题讨论】:
【参考方案1】:AFAIK,PInvoking 到具有 C++ 构造的函数不是受支持的操作。你也许可以让它工作,但我认为你会发现问题。
支持的是编写一个简单的 C 包装函数,该函数调用您的 C++ 函数。 PInvoke 改为包装函数,这样就可以解决问题。
【讨论】:
【参考方案2】:假设 c++ DLL 正确导出了通过引用传递的类型,您可以正确调用 dll 的轻量级托管 C++ 包装器。使用托管 c++,您可以直接调用本机 C/C++ 库和 dll,同时仍从生成的程序集中导出托管接口。其他 .Net 语言可以像调用任何其他程序集一样调用托管接口。这有点额外的开销,但它可能是完成它的最快方法。
【讨论】:
以上是关于将引用类型从 C++ 编组到 C#的主要内容,如果未能解决你的问题,请参考以下文章
在 c# 和 c++ 之间将 double 类型的二维多维数组作为输入和输出的 pinvoke 编组