我想从我的C#代码中调用我的非托管C++库。需要采取哪些潜在的陷阱和预防措施?感谢您的时间。在Windows上用Visual Studio混合C#代码和未被管理的C++代码
回答
这个问题太广泛了。唯一合理的答案是P/Invoke,但这就好像在说如果你想为Windows编程,你需要知道Win32 API。
几乎整本书都有关于P/Invoke(http://www.amazon.com/NET-COM-Complete-Interoperability-Guide/dp/067232170X),当然还有整个网站已经制作完成:http://www.pinvoke.net/。
有几条路线你可以用这个 - 一个,你可以更新你的非托管C++库有一个托管的C++扩展包装它们并让C#直接利用这些类。这有点费时,但它为传统非托管代码提供了一个很好的桥梁。但请注意,受管理的C++扩展有时难以浏览自己,因为它的语法与非托管C++相似,但足够接近以至于训练有素的人员能够看到差异。
另一条路线是让你的umnanaged C++实现COM类,并让C#通过自动生成的interop程序集使用它。如果你足够熟悉COM的话,这种方法更容易。
希望这会有所帮助。
您也可以通过P/Invoke调用非托管代码。如果你的代码目前不使用COM,这可能会更容易。我想你可能需要在你的代码中使用“C”绑定编写一些特定的导出点,如果你走这条路线的话。
也许你已经在我的经验,要留意的最重要的事情是,缺乏确定性垃圾收集的意思是,当你可能会认为他们会以前在析构函数将不会运行。您需要牢记这一点,并使用IDisposable或其他方法来确保您的托管代码在您希望的时候被清理干净。
您正在描述P/Invoke。这意味着您的C++库将需要通过DLL接口公开自己,并且接口将需要足够简单以通过调用属性描述P/Invoke。当托管代码调用到不可控制的世界时,参数必须被编组,因此它似乎有可能是轻微的性能损失,但你必须做一些测试,看看编组是显著与否。
当然,如果您将代码打包为具有外部入口点的DLL,那么总是会出现PInvoke。没有任何选择是无痛的。它们依赖于:a)你在编写COM或托管C包装器方面的技能; b)在PInvoke中查找你的手臂。
最简单的方法就是确保所有的C++功能都暴露为'C'风格的功能。确保将函数声明为_stdcall。
的extern “C” __declspec(dllexport)的INT _stdcall美孚(INT一)
确保你得到的编组权利,特别是像指针的东西& wchar_t的*。如果你弄错了,可能很难调试。来自任何一方,但不能同时
调试。在调试混合本机&时,调试器可能会变得非常慢。一次调试一面可以节省大量时间。
获得更具体的需要一个更具体的问题。
我会看看swig,我们利用这个良好的效果在我们的项目,我们的C++ API暴露在其他语言平台。
这是一个维护良好的项目,它可以有效地在您的C++库中构建一个可以允许C#等语言与您的本机代码直接通信的瘦包装程序,从而为您节省必须实施(和调试)粘合代码的麻烦。
如果您想要一个好的PInvoke示例,您可以查看PInvoke.net。它有如何调用大多数win API函数的例子。
此外,您可以使用本文中的工具Clr Inside Out: PInvoke将您的.h文件转换为c#包装。
- 1. Visual Studio 2010,C#和DirectX托管代码
- 2. 混合Objective-C和C++代码
- 3. 将VB.net代码与c#代码混合
- 4. C#的Visual Studio代码#
- 5. 在Visual Studio上支持C++代码
- 6. 使用C#Windows窗体管理代码
- 7. 如何在mac上的visual studio代码中执行C#代码
- 8. C#FileNotFoundException未被用户代码处理
- 9. Visual Studio C#代码颜色
- 10. 评论C++代码,visual studio
- 11. 管理C#代码片
- 12. 传递到C代码从C#代码在Visual Studio
- 13. Visual Studio 2010中的源代码管理?
- 14. 混合C/C++源代码:在C代码中获取sizeof(C++ struct)
- 15. Visual Studio 2012源代码管理
- 16. 使用Visual Studio管理源代码管理中的引用
- 17. 在Visual Studio中删除未使用的C#代码
- 18. 在Visual Studio 2010中发布代码C#
- 19. 混合processing.js代码和JavaScript代码
- 20. 从C#托管代码调用win32 CreateProfile()管理代码
- 21. 与Berkeley DB混合的C++/CLI代码
- 22. 具有非托管SQLite的混合C++/CLI代码
- 23. 如何在Visual Studio代码中调试C++代码
- 24. 如何在Visual Studio代码中调试C#代码
- 25. 无法在Visual Studio代码中调试C++代码
- 26. 在Visual Studio代码中构建一个C++程序代码
- 27. 混淆代码用C
- 28. 无法理解混淆的C代码
- 29. 在Visual Studio代码中混淆了git集成代码
- 30. 混合的Objective-C与C和代码组织
不会使用__dll_exports在任何Win32 DLL上进行P/Invoke工作? – 2009-02-18 11:59:42