【问题标题】:Extending a C++ application with C# plugins使用 C# 插件扩展 C++ 应用程序
【发布时间】:2008-12-29 22:20:44
【问题描述】:

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

我希望允许用户在 C++ 和 Python 之外用 C# 编写插件。由于我对 .NET 世界不是很熟悉,所以我不确定如何实现 C# 插件系统。

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

【问题讨论】:

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


    【解决方案1】:

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

          我过去曾以各种方式做到这一点。我发现 C++/CLI 是在 .Net 和非托管 C++ 之间架起一座桥梁的最佳选择(不过,正如其他海报所指出的,COM 是另一种选择)。

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

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

          最后,您将拥有一个用于编译 C# 插件的程序集。现在您需要在运行时加载插件程序集。为此,您必须托管 CLR。​​

          托管 CLR 并不难,尽管我只做过一次,那是几年前的事了——也许时代已经改变了。如果您对托管 CLR 不满意,请尽可能将您的应用程序代码推送到 DLL 中,然后编写一个小型 C++/CLI 应用程序来显示您的非托管 UI。现在 CLR 由小型 C++/CLI 应用托管。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-03-06
            • 2016-07-19
            • 2012-02-10
            • 2014-02-28
            • 1970-01-01
            相关资源
            最近更新 更多