12

在我们的项目中,我们有大量的本机 C++ 代码,我们希望从用 .Net 编写的全新 UI 层重用这些代码。

我想使用 C++/CLI 来解决这个问题,并且我已经看到有一种非常直接且相当技术性的方法可以通过使用瘦托管类包装本机类来做到这一点。我希望能够找到一种工具来自动完成这项任务,因为在我看来,这确实是一个技术问题,没有很多必需的“人”思维。

有这样的工具为此使用显式 p/invoke - 请参阅http://www.swig.org/Doc1.3/CSharp.html。问题是显式 p/invoke 更麻烦,性能效率更低。

有没有人熟悉这种工具?

此类工具尚不可用是否有内在原因?

4

2 回答 2

7

p/invoke 效率较低的原因是因为它必须是任何函数的非常通用的接口,只知道签名。您假设的包装器生成器不会表现得更好。

另一方面,编写自定义包装器类的开发人员有更多关于一起使用的函数的信息等等,因此可以避免许多缓慢和不必要的转换,例如通过将值直接存储在包装器内部而不是将它们转换为一些对 .NET 友好的格式。

所以并不是说这样的工具是不可能的,它几乎没有好处。如果您关心性能,则可以编写自己的包装器,并带有生命周期管理智能指针等。

当然,p/invoke 只提供对裸函数的访问。这就是 SWiG 应该提供帮助的地方,它可以通过裸导出函数公开任何 C++ 类接口。

我确实找到了一个可能是您正在寻找的工具的线索,尽管它听起来很狭窄:

于 2012-12-25T02:50:45.100 回答
0

显式 p/invoke 不一定是坏事。这真的取决于。以下链接包含您可能有兴趣阅读的其他信息。正如他们在具体示例中所经历的那样,具有抑制安全性的 P/Invoke 比调用本机 DLL 的任何其他方法(包括 C++/CLI)都更快。

http://rogue-modron.blogspot.com/2011/11/invoking-native.html

http://ybeernet.blogspot.com/2011/03/techniques-of-calling-unmanaged-code.html

我们有一个您可能有兴趣使用的工具。它是 C++ DLL 的 C# 包装器生成器。仅支持 VS 编译的 C++ DLL。

使用该工具,您可以直接从 DLL 文件和 C++ 头文件生成 C# 包装库。它会生成一个包含所有 C# 类文件的 Visual Studio 项目。支持所有标准的 c++ 类、模板类、您自己的类。您不必编写一行代码。

请阅读以下链接中的详细信息。

C#/.NET PInvoke 互操作 SDK

(我是该工具的作者)

于 2013-04-19T05:28:45.770 回答