我想从我的C#代码中调用我的非托管C ++库。 需要采取哪些潜在的陷阱和预防措施? 感谢您的时间。
使用Visual Studio在Windows上混合使用C#代码和非托管C ++代码
Mixing C# Code and umanaged C++ code on Windows with Visual Studio
===============>>#1 票数:3
您可以使用这几个路由 - 一个,您可以更新您的非托管C ++库,使其具有托管C ++扩展包装,并让C#直接使用这些类。 这有点耗时,但它为传统的非托管代码提供了一个很好的桥梁。 但请注意,托管C ++扩展有时难以自行导航,因为语法类似于非托管C ++,但足够接近,以至于训练有素的眼睛将能够看到差异。
另一条路由是你的umnanaged C ++实现COM类,并让C#通过自动生成的互操作程序集来使用它。 如果你足够了解COM的方式,这种方式会更容易。
希望这可以帮助。
===============>>#2 票数:1
你正在描述P / Invoke。 这意味着您的C ++库需要通过DLL接口公开自己,并且接口需要足够简单,以通过调用属性描述P / Invoke。 当托管代码调用非托管世界时,必须对参数进行编组,因此似乎可能会有轻微的性能损失,但您必须进行一些测试以查看编组是否重要。
===============>>#3 票数:1
最简单的方法是确保所有C ++功能都作为'C'样式函数公开。 确保将函数声明为_stdcall。
extern“C”__ declspec(dllexport)int _stdcall Foo(int a)
确保你正确编组,尤其是像指针和wchar_t *这样的东西。 如果你弄错了,可能很难调试。
从任何一方调试它,但不是两者都调试。 调试混合本机和托管时,调试器可能会变得非常慢。 一次调试1面可以节省大量时间。
更具体的问题需要一个更具体的问题。
===============>>#4 票数:1 已采纳
这个问题太宽泛了。 唯一合理的答案是P / Invoke,但这有点像说如果你想为Windows编程,你需要知道Win32 API。
几乎所有的书籍都是关于P / Invoke( http://www.amazon.com/NET-COM-Complete-Interoperability-Guide/dp/067232170X )编写的,当然整个网站都已制作完成: http:// www.pinvoke.net/ 。
===============>>#5 票数:0
您还可以通过P / Invoke调用非托管代码。 如果您的代码当前不使用COM,这可能会更容易。 我猜你可能需要使用“C”绑定在你的代码中写一些特定的导出点,如果你走这条路线的话。
根据我的经验,你必须要注意的最重要的事情是缺乏确定性的垃圾收集意味着你的析构函数不会在你以前想到它们时运行。 您需要牢记这一点并使用IDisposable或其他方法来确保在您希望的情况下清理托管代码。
===============>>#6 票数:0
当然,如果您将代码打包为具有外部入口点的DLL,那么总会有PInvoke。 没有一个选项没有痛苦。 它们取决于a)你写COM或管理C包装的技巧b)在PInvoke打你的手臂。
===============>>#7 票数:0
我会看看swig ,我们使用它来对我们的项目产生良好的影响,将我们的C ++ API暴露给其他语言平台。
这是一个维护良好的项目,可以有效地构建一个围绕C ++库的瘦包装器,它可以允许C#等语言直接与您的本机代码通信 - 从而避免了必须实现(和调试)粘合代码的麻烦。
===============>>#8 票数:0
如果你想要一个好的PInvoke示例,你可以看看PInvoke.net 。 它举例说明了如何调用大多数win api函数。
您也可以使用本文中的工具Clr Inside Out:PInvoke将您的.h文件转换为c#包装器。