2008-09-16 75 views

回答

3

有几条路线你可以用这个 - 一个,你可以更新你的非托管C++库有一个托管的C++扩展包装它们并让C#直接利用这些类。这有点费时,但它为传统非托管代码提供了一个很好的桥梁。但请注意,受管理的C++扩展有时难以浏览自己,因为它的语法与非托管C++相似,但足够接近以至于训练有素的人员能够看到差异。

另一条路线是让你的umnanaged C++实现COM类,并让C#通过自动生成的interop程序集使用它。如果你足够熟悉COM的话,这种方法更容易。

希望这会有所帮助。

0

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

也许你已经在我的经验,要留意的最重要的事情是,缺乏确定性垃圾收集的意思是,当你可能会认为他们会以前在析构函数将不会运行。您需要牢记这一点,并使用IDisposable或其他方法来确保您的托管代码在您希望的时候被清理干净。

1

您正在描述P/Invoke。这意味着您的C++库将需要通过DLL接口公开自己,并且接口将需要足够简单以通过调用属性描述P/Invoke。当托管代码调用到不可控制的世界时,参数必须被编组,因此它似乎有可能是轻微的性能损失,但你必须做一些测试,看看编组是显著与否。

0

当然,如果您将代码打包为具有外部入口点的DLL,那么总是会出现PInvoke。没有任何选择是无痛的。它们依赖于:a)你在编写COM或托管C包装器方面的技能; b)在PInvoke中查找你的手臂。

1

最简单的方法就是确保所有的C++功能都暴露为'C'风格的功能。确保将函数声明为_stdcall。

的extern “C” __declspec(dllexport)的INT _stdcall美孚(INT一)

确保你得到的编组权利,特别是像指针的东西& wchar_t的*。如果你弄错了,可能很难调试。来自任何一方,但不能同时

调试。在调试混合本机&时,调试器可能会变得非常慢。一次调试一面可以节省大量时间。

获得更具体的需要一个更具体的问题。

0

我会看看swig,我们利用这个良好的效果在我们的项目,我们的C++ API暴露在其他语言平台。

这是一个维护良好的项目,它可以有效地在您的C++库中构建一个可以允许C#等语言与您的本机代码直接通信的瘦包装程序,从而为您节省必须实施(和调试)粘合代码的麻烦。

0

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

此外,您可以使用本文中的工具Clr Inside Out: PInvoke将您的.h文件转换为c#包装。