最好的方法是什么......?
我有一些 native C++ 代码使用大量 Win32 调用和字节缓冲区(使用 HeapAlloc 分配)。我想扩展代码并制作一个 C# GUI...并可能在以后使用基本的 Win32 GUI(用于没有 .Net 和有限 MFC 支持的地方)。
(A) 我可以用 C# 重写代码并使用多个 PINVOKE……但即使在单独的类中使用 PINVOKES,代码看起来也很困惑,包含所有编码(marshal)处理。我也在重写很多代码。
(B) 我可以创建 native C++ DLL 并使用 PINVOKE 编码 native 数据结构。我假设我可以在使用 C# 的项目中包含 native C++ DLL/LIB?
(C) 创建混合模式 DLL( native C++ 类加上托管引用类)。我假设这将使在 C# 中使用托管 ref 类变得更容易......但情况是这样吗?托管类会处理所有编码吗?我可以在没有 .Net 的平台上使用这个混合模式 DLL(即仍然访问 native C++ 非托管组件)还是我将自己限制在只有 .Net 的平台上。
关于这些选项中的每一个都困扰我的一件事是所有的编码。创建托管数据结构(数组、字符串等)并将其传递给 native C++ 类更好,还是相反?
关于最佳实践的任何想法...?
更新: 我知道我可以从头开始重写 native C++ 代码,但这意味着复制代码并使我无法轻松地在任何 Win32 应用程序中重用任何代码更新。我最关心的是在托管和非托管世界之间编码各种数据的最佳方式。对我来说,混合模式 DLL 看起来是最灵活的选择,但我想对潜在的陷阱有不同的看法。
最佳答案
为什么不直接使用 .NET?在我看来,您的问题似乎源于您依赖于原始 native 库这一事实,但您没有提到它不能简单地在 .NET 中重新完成。
至于 .NET 原生互操作,PInvoke 很困惑,但它确实有效。如果您不能将原始 DLL 更改为 .NET,我会接受它。
关于c++ - 提示是否使用原生C++ DLL : PINVOKE & Marshaling?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2932867/