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