【发布时间】: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