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

6
我有一个应用程序,基本上是一个带有预加载控件的设计师,您可以使用这些控件设计页面。
我计划在未来发布更多控件。我不想为新添加的控件发布新版本,因为这样有其缺点。所以我想到了插件式/附加组件式的架构,在此仅发布插件/附加组件,他们可以安装并在设计师中获得控件。
目前,我正在使用xml文件作为插件,以指定控件、行为和样式等。每个xml(插件)表示一个单独的控件。但是我发现这很难实现,因为我必须编写通用解析器来读取所有插件。
相反,我可以为每个插件发布一个dll,这样我就可以更好地控制编写代码来定义控件的行为/外观,并通过主引擎动态加载它吗?如果可以,如何检查dll并在我的应用程序中动态加载它?

我记得在较新版本的.NET中有一个插件框架...我会尝试为您找到它们,因为您应该优先考虑使用这种方法。 - Daren Thomas
您也可以查看http://mef.codeplex.com。 - henginy
3个回答

12
你可能想看一下托管可扩展性框架(Managed Extensibility Framework),它可以解决大部分问题并提供更多功能,但需要学习一些新技术...
你还应该像mathieu建议的那样,一定要看看System.Addin命名空间!
如果你想走自己的路线,我建议采取以下步骤:
- 主应用程序中的插件接口 - 在插件dll中实现该接口 - 使用Assembly.Load在运行时加载dll
- 你可能需要考虑将插件程序集加载到单独的AppDomain中

4

+1 我不知道有两个,而我最终提出的(MEF)并不是我认为我提出的(MAF)- Google今天早上无法读取我的思想,必须喝更多咖啡 :) - Daren Thomas

1

MEF或System.Addins路由提到的可能是最有效的方法。我只是想说一下其他选择。

我已经“手工制作”了这种解决方案很多次,除非有强烈的理由从头开始做,否则最好使用现有的插件框架。但如果你要这样做,我发现像Castle或(在此处插入您喜欢的DI容器)这样的依赖注入容器可以帮助处理一些机制。

此外,根据您要做的具体事情,嵌入宏语言的方法可能是有用的。Iron Python很容易嵌入。Ayende写了一本非常有趣的书DSLs in Boo,介绍了这种方法和更多内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接