使用C#插件扩展C ++应用程序

时间:2008-12-29 22:20:44

标签: c# .net c++ windows plugins

我有一个C ++ Windows应用程序,可以通过编写C ++插件来扩展,使用应用程序公开的API。还有一个插件可以将C ++ API转换为Python(例如,插件可以用Python编写)。

除了C ++和Python之外,我想允许用户在C#中编写插件。由于我不熟悉.NET世界,我不确定如何实现C#插件系统。

您建议在这种插件系统中使用什么(主机是C ++,C#中的插件)?为了实现这一目标,我需要学习什么?

4 个答案:

答案 0 :(得分:3)

使用COM对象和接口公开您的API,您将打开您的应用程序到许多开发环境,包括C#。

答案 1 :(得分:3)

答案 2 :(得分:2)

实际上还有COM的建议。如果您真的想要添加第一类.NET插件支持,则可以托管您自己的CLR进程。这里有一篇非常有趣的文章。

http://msdn.microsoft.com/en-us/magazine/cc163567.aspx

答案 3 :(得分:1)

我过去曾以各种方式做过这件事。我发现C ++ / CLI是构建.Net和非托管C ++之间桥梁的最佳选择(但是,如其他海报所述,另一种选择是COM)。

过去我这样做的方法包括:

  1. 使用反射从我的C ++ API生成C ++ / CLI API包装器代码。当然,本机C ++没有反射系统,所以我们自己编译。然后,生成的C ++ / CLI代码被编译为C#插件将引用的程序集。
  2. 使用反射从我的C ++ API生成动态程序集(即使用Reflection.Emit的东西)。生成的程序集可以在进程中用于脚本语言,或者甚至可以在运行时针对它编译C#代码。甚至可以将程序集写入磁盘以静态使用。这里的缺点是你可能无法发出比编译器更好的IL,所以除非你需要动态生成,否则不要走这条路。
  3. 手写的C ++ / CLI API包装器。如果API不是很大,手工编写包装很容易。
  4. 最后,您将有一个C#插件的程序集进行编译。现在您需要在运行时加载插件程序集。为此,您必须托管CLR。

    托管CLR并不困难,虽然我只做了一次而且那是几年前 - 也许时间已经改变了。如果你不熟悉托管CLR,那么尽可能将你的应用程序代码粘贴到DLL中,然后编写一个小的C ++ / CLI应用程序来启动你的非托管UI。现在CLR由小型C ++ / CLI应用程序托管。