将引用类型从 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#

在 c# 和 c++ 之间将 double 类型的二维多维数组作为输入和输出的 pinvoke 编组

直接将 C++ 浮点数组成员编组到 C#,无需复制

C# 中的 C++ int & long 编组

如何在 C# 中编组数据类型 unsigned char**?

具有对 C# 的整数引用的元帅结构