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

12

到目前为止,我已经知道需要将库重新编译为.dll而不是.lib,启用/clr/EHa而不是/EHsc。现在我有了一个托管的dll,我已经将其添加为我的C#项目的引用。

现在该如何使用它?

我准备编写一些包装器,但我不知道从何开始或如何“查看”我已获得访问权限的函数。我已经了解了一些关于类名和函数可能会被编译器搞乱的信息......我需要回去到处添加__declspec导出(如果需要,该怎么做?),还是VS2010中有一个选项说“不要混淆它!”?

所涉及的C ++库仍在积极开发中,因此我希望尽可能少地修改C ++库,并定期使用一些开关重新编译它,然后根据需要公开新功能。

4个回答

8
如果您要编译C++(如果最初是非托管的C ++),则需要做比仅添加/clr开关更多的工作。为了使C#使用DLL,您需要创建基于与C#(.NET)兼容的CTS的托管类和其他类型。请参见ref类。此处有详细信息。关于此主题的好书(以我的个人看法)是此书

那么...要创建托管类,我需要用C++/CLI吗?我需要更多信息才能开始。 - mpen
是的,你需要更多的信息。我建议查看这些链接。此外,微软还提供了一些将C++转换为托管C++的工具,这可能也会有所帮助。请参考以下链接:https://dev59.com/OEXRa4cB1Zd3GeqPq1v3 - AndersK

6

你可以将你的dll中的函数暴露为C风格的函数(即无名称修饰),或者将它们作为COM对象暴露出来。


我该如何将它们用作COM对象? - mpen

4
我建议编写一个COM包装器,然后使用它。请参考http://msdn.microsoft.com/en-us/library/035x3kbh%28v=VS.80%29.aspx中的介绍指南。您需要使您的对象接口派生自IDispatch并且具有自动化兼容性,这样运行时就可以在没有任何自定义封送的情况下使用它们。
这种方法的一个好处是您可以继续将本地代码构建为库,并使您的COM项目使用它。此外,它仍然是COM对象内部的本地代码,因此潜在的未知问题要少得多(一旦您让接口层正常工作)。
无论如何,这就是我的建议。

2

是的,将它包装在一个COM对象中。我相信ATL是最省力的方法。


ATL?你在跟一个从未做过这个的人说话。 - mpen
ActiveX 模板库。它是 MS 开发环境的一部分,用于在 C++ 中创建 COM 对象。 - H. den Breejen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接