我目前有一个巨大的项目,我最近从 VC6 转换到 2005。现在我真的很想为一些功能创建一个新的前端,但是程序的主要逻辑是基于 c++ 的。代码库也围绕它自己的元类型和定制类展开。
我能想出的最佳解决方案是从 C++ 项目 dll 中调用函数。然而,这导致了巨大的数据编组投资,其中数据跨越了 c++ 和 c# 之间的边界。我想知道是否还有其他选择(完全重写不是一种选择)。
谢谢丰富
我目前有一个巨大的项目,我最近从 VC6 转换到 2005。现在我真的很想为一些功能创建一个新的前端,但是程序的主要逻辑是基于 c++ 的。代码库也围绕它自己的元类型和定制类展开。
我能想出的最佳解决方案是从 C++ 项目 dll 中调用函数。然而,这导致了巨大的数据编组投资,其中数据跨越了 c++ 和 c# 之间的边界。我想知道是否还有其他选择(完全重写不是一种选择)。
谢谢丰富
如果要为本机 DLL 创建托管前端,则必须来回编组数据。真的没有办法避免这个问题。
我们目前在我们当前的一个项目中面临着类似的问题。我们采用的方法是使用 PInvoke 来谈论 Managed -> Native。除了少数例外,我们只 PInvoke blittable 类型,这有助于降低封送处理的成本,因为 CLR 可以将其实现为内存副本。
在交流本机 -> 托管时,我们使用 COM 对象。我们尝试对 blittable 应用相同的规则,但我们发现在这种情况下您经常必须包含许多 COM 对象,这会阻止 blittable-ness。
采用这种方法对我们来说效果很好。我们花了一些时间来获取为数据编组定义的原语。但在那之后,编组变成了……因为没有更好的词而成为惯例。这是一个开销,但它比完全重写便宜得多。
我以前使用 C++/CLI(以前称为托管 C++)来处理互操作 - 如果您已经在使用 C++,它可能是比 P/Invoke 更好的选择。许多互操作“正常工作”,您将获得编译时安全性,而不是您可能关心或不关心的多毛运行时绑定。