是否使用本机C ++ DLL的建议:PINVOKE&封送?

时间:2010-05-28 22:17:09

标签: c++ dll pinvoke marshalling native

最好的方法是什么??

我有一些Native C ++代码,它使用大量Win32调用和字节缓冲区(使用HeapAlloc分配)。我想扩展代码并制作一个C#GUI ......以后可能会使用基本的Win32 GUI(用于没有.Net和有限的MFC支持的地方)。

(A)我可以在C#中重新编写代码并使用多个PINVOKE ....但即使PINVOKES在一个单独的类中,代码看起来也很混乱所有的编组。我也在重写很多代码。

(B)我可以创建一个本机C ++ DLL并使用PINVOKE来编组本机数据结构。我假设我可以使用C#在项目中包含本机C ++ DLL / LIB?

(C)创建混合模式DLL(Native C ++类加上托管ref类)。我假设这样可以更容易地在C#中使用托管的ref类......但是这样的情况呢?托管类是否会处理所有封送处理?我可以在没有.Net的平台上使用这个混合模式DLL(即仍然访问本机C ++非托管组件),还是仅限于.Net的平台。

困扰我的每一个选项的一件事是所有的编组。是创建托管数据结构(数组,字符串等)并将其传递给本机C ++类更好,还是相反?

关于什么是最佳实践的任何想法......?

更新: 我知道我可以从头开始重写本机C ++代码,但这意味着复制代码并阻止我轻松地将任何代码更新重用于任何Win32应用程序。最让我担心的是在托管和非托管世界之间编组各种数据的最佳方法。对我来说,混合模式DLL看起来是最灵活的选项,但我想对潜在的陷阱有不同的看法。

2 个答案:

答案 0 :(得分:1)

为什么不直接使用.NET?在我看来,您的问题源于您依赖于原始本机库这一事实,但您没有提到它不能简单地在.NET中重新完成。

对于.NET本机互操作,PInvoke很乱,但确实有效。如果您不能将原始DLL更改为.NET,我会继续使用它。

答案 1 :(得分:0)

如果编组简单易用,框架可以处理(如果一切都搞砸了吗?),那么选项C会给你最少的工作。它还为您提供了一个可以自己编组的地方。我写了一些关于这个年代之前在日期类型之间编组的东西,但我想今天我会写一个marshal_as<>托管类型和本机类型之间的重载。这将是最优雅的解决方案,也是最少的代码。

更新:发现我的旧文章 - 它是针对PInvoke的。 http://codeguru.earthweb.com/columns/kate/article.php/c4867/