实现插件架构 – 动态DLL加载

我的应用程序基本上是一个带有预加载控件的设计器,您可以使用控件设计页面。

我计划将来发布越来越多的控件。 我不想为新添加的控件发布新版本,因为它有它的缺点。 所以我想的是addon / plugin类型的架构,我只是单独发布addon / plugin,他们可以安装并获得设计器内的控件。

现在我使用xml文件作为插件来指定控件,它的行为,它的样式等。每个xml(插件)代表一个控件。 但我发现很难实现这个,因为我要写一个通用的解析器来读取所有的插件。

相反,我可以为每个插件释放一个dll,这使我能够更好地控制编写代码来定义控件的行为/外观并通过主引擎动态加载它吗? 如果是这样,我如何检查dll并在我的应用程序中动态加载它?

您可能希望查看Managed Extensibility Framework 。 这可能会解决您的大部分问题以及更多问题,但需要学习一些新技术……

你也应该像mathieu建议的那样深入研究System.Addin命名空间!

如果您想使用自己的路线,我建议采用以下方法:

  • 主应用程序中的插件接口
  • 在addon dll中实现该接口
  • 使用Assembly.Load在运行时加载dll
    • 您可能希望将插件程序集加载到单独的AppDomain中

您应该查看System.Addin命名空间,因为它确实符合您的需要。 在开发插件之后,您只需将其放在一个文件夹中,它就可以(在运行时)用于您的应用程序。

请参阅此问题以进行比较: 在MEF和MAF之间进行选择(System.AddIn)

提到的MEF或System.Addins路线可能是最有效的方法。 我只是谈谈替代方案的一些事情。

我已经多次“手动”这种解决方案,我会说,除非有令人信服的理由从头开始,否则最好使用现有的插件框架。 但是如果你打算这样做的话,我发现像Castle这样的dependency injection容器或者(在这里插入你喜欢的DI容器)来帮助处理一些机制。

同样取决于您想要做的事情,嵌入宏语言的方法可能是有用的。 Iron Python易于嵌入。 Ayende 在Boo写了一本非常有趣的书籍来做这类事情等等。