2011-05-25 52 views
2

我有一个应用程序,基本上是一个预加载控件的设计器,您可以使用控件设计您的页面。实现插件体系结构 - 动态DLL加载

我打算在未来发布越来越多的控件。我不想为新添加的控件发布新版本,因为它有缺点。所以我想到了插件/插件类型的架构,我只是单独发布插件/插件,他们可以安装它们并在设计器中获取控件。

现在,我使用xml文件作为插件来指定控件,它的行为,它的样式等每个XML(插件)代表一个单一的控制。但是我发现实现这个非常困难,因为我必须编写一个通用解析器来读取所有插件。

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

+0

我以为在新版本的.NET中有一个插件框架......我会试着为你找到它们,因为你可能应该去那条路线。 – 2011-05-25 06:31:47

+0

你也可以查看http://mef.codeplex.com。 – henginy 2011-05-25 06:32:36

回答

9

你可能想看看Managed Extensibility Framework。这可能会解决你的大部分问题和更多,但将需要学习一些新的技术...

你也应该一定要看看System.Addin命名空间为mathieu建议!

如果你想要去用自己的路线,我建议采取下列措施:

  • 在主应用程序的插件接口
  • 实现插件的DLL
  • 负荷DLL文件在那个界面运行时与Assembly.Load
    • 你可能想看看加载插件组件到一个单独的AppDomain
4

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

进行比较看到这个问题:提到Choosing between MEF and MAF (System.AddIn)

+0

+1我不知道有两个,我最终提出的建议(MEF)不是我认为我提出的建议(MAF) - 谷歌今天早上无法读懂我的想法,需要更多的咖啡:) – 2011-05-25 06:59:56

1

的MEF或System.Addins路线可能去这个最有效的方式。我只想谈谈关于替代品的一些事情。

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

同样取决于你想要做的事情,嵌入宏语言的方法可能是有用的。铁蟒很容易嵌入。 Ayende写了一本非常有趣的书DSLs in Boo做这种事情等等。