2010-05-28 57 views
2

这样做的最佳方法是什么....?关于是否使用本地C++ DLL的建议:PINVOKE&Marshaling?

我有一些本地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 only平台。

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

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

更新: 我知道我可以重新编写原生C++代码,但它意味着复制代码并阻止我轻松地重新使用任何代码更新与任何Win32应用程序。最让我感兴趣的是整理托管和非托管世界之间各种数据的最佳方式。对我而言,混合模式DLL看起来是最灵活的选择,但我想对潜在的缺陷有不同的看法。

回答

1

为什么不直接使用.NET?在我看来,您的问题来自于您依赖原始本地库的事实,但您并未提及它不能简单地在.NET中重新完成。

至于.NET本地互操作,PInvoke是混乱的,但它确实有效。如果你不能将原始的DLL改变成.NET,我会这样做。

0

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

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