【问题标题】:Interface for plugins to implement in .Net在 .Net 中实现的插件接口
【发布时间】:2011-10-31 23:22:03
【问题描述】:

我想在我的 .net 应用程序中实现一个插件系统,而不使用 MEF。

我的应用程序加载并创建包含在 DLL 中的类型实例。

主应用程序程序集使用一个接口 (IPluginContract) 来加载 dll 类型,并且 dll 项目(插件)使用这个相同的接口来实现它。

所以不同的项目需要访问相同的界面。

我可以通过将接口类推送到单独的类库中来实现这一要求,主应用程序和插件都会引用该类库。

这是解决所描述问题的正确方法吗?

【问题讨论】:

  • 实现插件和应用程序都将引用接口 DLL。将插件加载到他们自己的应用程序域中是个好主意。
  • 您是否有不能使用 MEF 的原因?
  • 很抱歉,我没有看到您不想使用 MEF 的说明。删除了答案。然而,我仍然推荐它。
  • +1 提出了一个很好的问题。我会选择 MEF,但很高兴知道另一种方式也是可能的。

标签: c# .net plugins dll interface


【解决方案1】:

是的,将您的接口推送到共享库中是首选解决方案。然后你只需要把这个库分发给插件开发者,这可以被认为是轻量级的,但插件将与接口的确切版本耦合。

另一种解决方案是基于约定的解决方案,其中插件编写者具有“符合”接口的类型,例如在可以通过配置文件指向的类上具有适当的方法。然后,您可以使用反射、IL 生成等将其连接到具体的内部接口\代理。这样做的好处是插件不会硬连接到特定的接口版本,因此版本控制更加灵活。

您还可以考虑通过维护界面的所有版本来进行版本控制,例如IPlugin_1、IPlugin_2 等。然后由插件编写者来实现哪个版本,并让您能够处理每个版本。

【讨论】:

  • 谢谢。我打算让其他人开发插件,所以我通过反射提取方法的方法似乎非常好。
【解决方案2】:

根据当时的情况(上市时间、实施难度、内部风险等),我们成功地采取了两种不同的方法来解决这个问题:

1) 将接口移动到它自己的 DLL 中。如果插件不需要在主应用程序 DLL 中嵌入任何其他支持对象/函数/数据,或者如果您不想将主 DLL 中的公共成员公开给插件编写者,则此方法非常有效。

2) 将接口留在主 DLL 中。我们主要在移动接口和相关类的重构成本太高或插件完全自包含(即我们为客户编写它们)时使用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-27
    • 1970-01-01
    • 2011-06-04
    • 2013-01-08
    • 2012-01-22
    相关资源
    最近更新 更多