我想从我的 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++ 类似,但足够接近,训练有素的眼睛将能够看到差异。

另一种方法是让你的未管理的 C++ 实现 COM 类,并让 C# 通过自动生成的互操作程序集使用它。如果您足够了解 COM,那么这种方法会更容易。

希望这可以帮助。

您正在描述 P/Invoke。这意味着您的 C++ 库需要通过 DLL 接口公开自身,并且该接口需要足够简单才能通过调用属性向 P/Invoke 进行描述。当托管代码调用非托管世界时,必须对参数进行编组,因此似乎可能会对性能造成轻微影响,但您必须进行一些测试来查看编组是否重要。

最简单的开始方法是确保所有 C++ 功能都公开为“C”样式函数。确保将该函数声明为 _stdcall。

extern "C" __declspec(dllexport) int _stdcall Foo(int a)

确保编组正确,尤其是指针和 wchar_t * 之类的内容。如果弄错了,调试起来可能会很困难。

从任一侧进行调试,但不能从两侧进行调试。当调试混合本机和托管时,调试器可能会变得非常慢。一次调试一侧可以节省大量时间。

变得更具体需要更具体的问题。

您还可以通过 P/Invoke 调用非托管代码。如果您的代码当前不使用 COM,这可能会更容易。我想如果您走这条路,您可能需要使用“C”绑定在代码中编写一些特定的导出点。

根据我的经验,您需要注意的最重要的事情可能是缺乏确定性垃圾收集意味着您的析构函数不会像您之前认为的那样运行。您需要记住这一点,并使用 IDisposable 或其他一些方法来确保您的托管代码在您希望的时候被清理。

当然,如果您将代码打包为具有外部入口点的 DLL,那么总有 PInvoke。没有一个选择是没有痛苦的。它们取决于 a) 您编写 COM 或托管 C 包装器的技能 b) 在 PInvoke 上的机会。

我会看一下 痛饮, ,我们使用它在我们的项目中取得了良好的效果,将我们的 C++ API 暴露给其他语言平台。

这是一个维护良好的项目,可以有效地围绕 C++ 库构建一个薄包装器,允许 C# 等语言直接与本机代码通信 - 为您省去了实现(和调试)粘合代码的麻烦。

如果你想要一个好的 PInvoke 示例,你可以看看 PInvoke.net. 。它有如何调用大多数 win api 函数的示例。

您也可以使用本文中的工具 由内而外的清除:调用 这会将您的 .h 文件转换为 C# 包装器。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top