c++ - 提示是否使用原生C++ DLL : PINVOKE & Marshaling?

标签 c++ dll pinvoke marshalling native

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

我有一些 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/

相关文章:

c++ - 为什么我的模板特化不起作用?

c++ - Main() 是否接受表达式?

c++ - 在面向对象的 C++ 中处理大数字变量

c++ - 如何在 C++ 中包含、加载和使用 .dll

c# - 从 C++ 到 C# 的二进制/十六进制数据的编码/DllImport

c# - 将指向对象的非托管 C++ 指针转换为托管 C# 对象

c++ - 添加到指针 vector 时出错

c++ - 链接到自己创建的 dll 失败

qt - 在QT中导入没有.lib或.h的DLL

c# - C# 中的 C++ 非托管 DLL