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

时间:2011-05-25 06:23:14

标签: c# .net asp.net dynamic-loading plugin-architecture

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

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

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

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

3 个答案:

答案 0 :(得分:9)

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

你也应该按照mathieu建议的那样查看System.Addin命名空间!

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

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

答案 1 :(得分:4)

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

请参阅此问题进行比较:Choosing between MEF and MAF (System.AddIn)

答案 2 :(得分:1)

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

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

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