【问题标题】:Advice on whether to use native C++ DLL or not: PINVOKE & Marshaling?关于是否使用本机 C++ DLL 的建议:PINVOKE & Marshaling?
【发布时间】:2010-05-28 22:17:09
【问题描述】:

最好的方法是什么......?

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

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

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

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

每个选项都让我感到困扰的是所有编组。创建托管数据结构(数组、字符串等)并将其传递给本机 C++ 类是否更好,或者相反?

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

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

【问题讨论】:

    标签: c++ dll pinvoke marshalling native


    【解决方案1】:

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

    对于 .NET-native 互操作,PInvoke 很混乱,但它确实有效。如果您不能将原始 DLL 更改为 .NET,我会同意。

    【讨论】:

      【解决方案2】:

      如果编组被证明是简单且易于框架处理的(所有东西都是 blittable 吗?),选项 C 为您提供最少的工作。它还为您提供了一个可以进行自己编组的地方。我在很久以前写了一些关于日期类型之间编组的东西,但我想今天我会在你的托管类型和本机类型之间写一个 marshal_as 重载。这将是最优雅的解决方案,也是最少的代码。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-04-05
        • 1970-01-01
        • 2011-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-07
        相关资源
        最近更新 更多