如何在 C# 应用程序中使用 C++ 库?

Posted

技术标签:

【中文标题】如何在 C# 应用程序中使用 C++ 库?【英文标题】:How to use a C++ library in a C# app? 【发布时间】:2010-10-25 00:27:59 【问题描述】:

到目前为止,我发现我需要将库重新编译为.dll 而不是.lib,启用/clr/EHa 而不是/EHsc。现在我有了一个托管 dll,我已将它作为参考添加到我的 C# 项目中。

现在我该如何使用它?

我准备编写一些包装器,但我不知道从哪里开始或如何“查看”我已获得访问权限的功能。我已经阅读了一些关于编译器如何破坏类名和函数的内容......我是否需要返回并在任何地方添加 __declspec 导出(如果是,如何?),或者是否有一个选项VS2010 说“不要弄坏它!”?

有问题的 C++ 库仍在积极开发中,所以我希望我可以尽可能少地修改 C++ 库,只需通过一些开关定期重新编译它,然后根据需要公开新功能。

【问题讨论】:

【参考方案1】:

如果您要编译您的 C++(如果最初是非托管 C++),您需要做的不仅仅是添加 /clr 开关。为了让 C# 使用 DLL,您需要创建托管类和基于与 C# (.NET) 兼容的 CTS 的其他类型。

See 和 ref 类。

一本关于该主题的好书(恕我直言)是one

【讨论】:

所以...要创建托管类,我需要在 C++/CLI 中执行此操作,还是什么?我还需要继续。 是的,您还需要更多内容,我建议您查看链接。还有一些工具可以将 C++ 转换为 Microsoft 的托管 C++,这也可能有所帮助。看看这个:***.com/questions/151776/…【参考方案2】:

您可以将函数作为 C 样式函数从您的 dll 中公开(即,不进行修改),也可以将它们公开为 COM 对象。

【讨论】:

如何将它们用作 COM 对象?【参考方案3】:

我建议编写一个 COM 包装器,然后改用它。查看http://msdn.microsoft.com/en-us/library/035x3kbh%28v=VS.80%29.aspx 了解介绍说明。您需要使您的对象接口派生自 IDispatch 并与自动化兼容,这应该使运行时能够在没有任何自定义封送处理的情况下使用它们。

这种方法的一个很好的好处是您可以继续将您的本机代码构建为一个库,并让您的 COM 项目使用它。此外,它仍然是 COM 对象内的本机代码,因此出现未知问题的可能性要小得多(一旦您让接口层工作)。

无论如何,这是我的建议。

【讨论】:

【参考方案4】:

是的,将它包装在一个 COM 对象中。我相信 ATL 是您可以用最少的努力做到这一点的方法。

【讨论】:

ATL?您正在与以前从未这样做过的人交谈。 ActiveX 模板库。它是 MS 开发环境的一部分,用于在 C++ 中创建 COM 对象。

以上是关于如何在 C# 应用程序中使用 C++ 库?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 C++ 静态库编译 C# 应用程序?

如何在带有 VB.net GUI 的 C++ OpenCV 项目中使用 C# 库?

从 C++ 库方法返回的“char*”获取 C# 字符串?

在 C++ 应用程序的另一个目录中使用 C# 库

如何创建中间库?

将 C# 3D 数组作为 1D 字节数组传递给 C++ 库