gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:36:44 26 4
gpt4 key购买 nike

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

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com