【问题标题】:What is the best way to wrap unmanaged C++ classes so they can be consumed by .Net managed client applications?包装非托管 C++ 类以便它们可以被 .Net 托管客户端应用程序使用的最佳方法是什么?
【发布时间】:2015-03-06 22:05:08
【问题描述】:

我们有一个 win32 C++ 非托管库(在后台调用 Boost 和 openCV)。 该库包含几个公共类定义。 这些类本身公开了几个方法,其参数包括向量、共享指针 并将回调作为其方法签名的一部分。

我们想创建一个包装器,允许 .Net(托管)客户端使用这些类。 我们希望保留对现有非托管客户端应用程序的支持。所以我想这必须是 一个单独的 DLL/库。另一个考虑因素是跨托管/非托管的性能编组 边界。我们将在客户端应用程序和库之间来回推送图像的字节数组 每秒30-50次的速度。

这样做的最佳方法是什么?

有人可以为我指明任何示例实现、教程和策略的方向吗? 我最后一次看到这样的东西已经是 10 多年前了。 我似乎隐约记得 pInvoke 和 IJW 的工作原理。

任何想法将不胜感激。

谢谢, 约翰B

【问题讨论】:

  • 如果这是一个高性能应用程序,那么我会避免如此频繁地与 .NET 进行数据传输。尝试找到一种方法来最大限度地减少执行的 .NET 代码量,尤其是在紧密循环中。我建议通过 COM 接口而不是托管 C++ 或任何类型的互操作来导出功能。
  • @Dai:感谢您的快速响应。大部分繁重的计算都是在非托管层中完成的。托管层捕获数据/图像,将其推送到非托管库进行处理,然后使用结果。你能扩展一下 COM 接口的想法吗?

标签: c++ .net pinvoke marshalling


【解决方案1】:

我将创建一个围绕您的本机 C++ 的托管 C++。 将本机 C++ 编译为静态库,创建引用静态 C++ 库的托管 C++ DLL 并编写包装器代码。我已经做过几次了,很简单。

看看这个例子:http://www.codeproject.com/Articles/19354/Quick-C-CLI-Learn-C-CLI-in-less-than-minutes#A8

【讨论】:

  • 不需要静态库。直接编译代码。此外,它是 C++/CLI,现在不是托管 C++。
猜你喜欢
  • 2021-10-30
  • 2010-12-25
  • 1970-01-01
  • 2015-02-11
  • 1970-01-01
  • 2021-08-04
  • 2011-03-04
  • 2010-10-08
  • 2012-01-14
相关资源
最近更新 更多