到目前为止,我已经想出我需要将库重新编译为.dll
而不是.lib
,启用/clr
和/EHa
而不是{{1 }}。现在我有一个托管的dll,我在C#项目中添加了它作为参考。
现在我该如何使用它?
我准备写一些包装器,但我不知道从哪里开始或如何“看到”我获得了哪些功能。我已经阅读了一些关于类名称和函数如何被编译器破坏的内容...我是否需要返回并在任何地方添加/EHsc
个出口(如果是这样,怎么样?),或者是否存在VS2010中的选项“不要破坏它!”?
有问题的C ++库仍在积极开发中,所以我希望我能尽可能少地修改C ++库,只需用几个开关定期重新编译它,然后根据需要公开新功能。
答案 0 :(得分:8)
如果要编译C ++(如果最初是非托管C ++),则需要做的不仅仅是添加/ clr开关。为了让C#使用DLL,您需要创建托管类和基于CTS的其他类型,这些类型与C#(.NET)兼容。
See和参考类。
关于这个主题(恕我直言)的一本好书是one
答案 1 :(得分:6)
您可以将函数作为C样式函数公开(即,不进行修改),也可以将它们公开为COM对象。
答案 2 :(得分:4)
我建议编写一个COM包装器,然后使用它。有关介绍说明,请查看http://msdn.microsoft.com/en-us/library/035x3kbh%28v=VS.80%29.aspx。您将希望使您的对象接口从IDispatch派生并与自动化兼容,这应该使运行时能够使用它们而无需任何自定义封送。
这种方法的一个好处是,您可以继续将本机代码构建为库,并让您的COM项目使用它。此外,它仍然是COM对象中的本机代码,因此未知问题的可能性要小得多(一旦您使接口层工作)。
无论如何,这是我的建议。
答案 3 :(得分:2)
是的,将其包装在àCOM对象中。我相信ATL是您需要以最少的努力完成这项工作的。