在Windows和Visual Studio上混合使用C#代码和非托管C ++代码
我想从我的Ccode调用我的非托管C ++库。需要采取哪些潜在的陷阱和预防措施?感谢时间。
解决方案
回答
我们可以使用以下两种方法,可以更新非托管的C ++库,使其周围具有托管的C ++扩展包装,并可以直接利用这些类。这有点耗时,但是它为传统的非托管代码提供了很好的桥梁。但是请注意,托管C ++扩展有时本身很难导航,因为其语法类似于非托管C ++,但是要足够近,以使受过良好训练的人能够看到它们之间的差异。
要走的另一条路线是让C ++实现COM类并通过自动生成的互操作程序集对其进行Cutil利用。如果我们对COM有足够的了解,那么这种方法会更容易。
希望这可以帮助。
回答
我们也可以通过P / Invoke调用非托管代码。如果代码当前不使用COM,则可能会更容易。我想如果走这条路线,我们可能需要使用" C"绑定在代码中编写一些特定的导出点。
根据我的经验,我们可能需要注意的最大事情就是缺乏确定性垃圾回收功能,这意味着析构函数将无法运行,而我们可能原本以为这样。我们需要牢记这一点,并使用IDisposable或者其他方法来确保在需要时清除托管代码。
回答
我们正在描述P /调用。这意味着C ++库将需要通过DLL接口公开自身,并且该接口必须足够简单以通过调用属性来描述P / Invoke。当托管代码进入非托管环境时,必须对参数进行编组,因此似乎会对性能造成轻微影响,但是我们必须进行一些测试以查看编组是否有意义。
回答
当然,如果我们将代码打包为带有外部入口点的DLL,那么总会有PInvoke。这些选择都不是没有痛苦的。它们取决于a)我们编写COM或者托管C包装程序的技能b)在PInvoke上花些时间。
回答
最简单的开始方法是确保所有C ++功能都以" C"样式功能公开。确保将函数声明为_stdcall。
extern" C" __declspec(dllexport)int _stdcall Foo(int a)
确保正确编组,尤其是指针和wchar_t *之类的东西。如果弄错了,可能很难调试。
从任何一侧调试它,但不能同时调试。在调试本机和托管的混合时,调试器会变得很慢。一次调试一侧可节省大量时间。
变得更加具体将需要一个更具体的问题。
回答
我来看看swig,我们用它对我们的项目产生了很好的效果,将我们的C ++ API暴露给其他语言平台。
这是一个维护良好的项目,可以在C ++库周围有效地构建一个瘦包装器,该包装器可以使诸如C之类的语言直接与本机代码通信,从而省去了实现(和调试)粘合代码的麻烦。
回答
如果我们想要一个很好的PInvoke示例,可以查看PInvoke.net。它提供了有关如何调用大多数win api函数的示例。
我们也可以使用本文" Clr Inside Out:PInvoke"中的工具,该工具会将.h文件转换为cwrappers。
回答
这个问题太笼统了。唯一合理的答案是P / Invoke,但这有点像说如果我们要为Windows编程,则需要了解Win32 API。
关于P / Invoke(http://www.amazon.com/NET-COM-Complete-Interoperability-Guide/dp/067232170X)的几乎所有书籍都已经写好了,当然,整个网站也已建立:http:// www.pinvoke.net/。