在我们的项目中,我们有大量的原生C++代码,我们希望在用.Net编写的全新UI层中重用这些代码。
我想使用C++/CLI来解决这个问题,我已经看到有一种非常简单且相当技术性的方法,通过用瘦托管类包装本机类来实现。我希望能够找到一种工具来自动完成这项任务,因为在我看来,这真的是一个技术问题,没有太多必要的“人类”思考。
有这样的工具,它使用显式的p/invoke来实现这一点--参见http://www.swig.org/Doc1.3/CSharp.html。问题是,显式的p/invoke在性能上更麻烦,效率也更低。
有没有人熟悉这样的工具?
这样的工具还不能使用,有没有内在的原因?
发布于 2012-12-25 10:50:45
p/invoke效率较低的原因是,它必须是任何函数的一个非常通用的接口,只知道签名。您假设的包装器生成器的性能也不会更好。
另一方面,编写自定义包装类的开发人员有更多关于一起使用的函数等的信息,因此可以避免许多缓慢和不必要的转换,例如,通过直接将值存储在包装器中,而不是将它们转换为某种.NET友好的格式。
因此,这并不是说这样的工具是不可能的,只是它几乎没有好处。如果您关心性能,您可以编写自己的包装器,并使用生命周期管理智能指针等来完成。
当然,p/invoke只提供对裸函数的访问。这就是SWiG应该有用的地方,它可以通过裸导出的函数公开任何C++类接口。
我确实在一个工具上找到了一个线索,这可能就是你正在寻找的,尽管它的关注点听起来相当狭窄:
发布于 2013-04-19 13:28:46
显式的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++动态链接库的C#包装器生成器。仅支持VS编译的C++ DLL。
使用该工具,您可以直接从DLL文件和C++头文件生成C#包装库。它生成一个包含所有C#类文件的Visual Studio项目。所有的标准c++类,模板类,你自己的类都被支持。你不需要写一行代码。
请在下面的链接中阅读详细信息。
C#/.NET PInvoke Interop SDK
(我是该工具的作者)
https://stackoverflow.com/questions/14022131
复制相似问题