有没有办法直接在C#中对应用程序的各个部分进行插件控制?

时间:2010-11-23 22:24:17

标签: c# .net plugins

我有一个.NET 2.0应用程序。我想要做的是创建一个可以某种方式访问​​主应用程序的插件。

我的理由是我希望能够动态地向窗体添加按钮和菜单项之类的内容,而不是让我更新一个名为“插件”的菜单项。这样我就可以在不重新发布整个应用程序的情况下向应用程序GUI添加内容。

现在我可以想到两种方式。一,我可以创建插件,使其始终需要对整个应用程序的引用,包括所有表单。我可以让它访问我在表单中选择的任何项目,它可以随意添加控件或其他任何内容。这让我有点不安,但如果这是可以接受的,请告诉我。

我能想到的另一种方法是为主应用程序中的每个表单设置某种界面,以便我可以使用该界面访问应用程序中的当前表单。不过,我不知道如何实现这一点。

所有帮助,建议,网站参考和评论都表示赞赏。

4 个答案:

答案 0 :(得分:2)

部分原因在于谁会编写插件,你信任它们,以及当插件出现问题时用户体验或数据会发生什么变化?

Fiddler http://www.fiddler2.com/fiddler2/是一个Web调试代理,它的插件模型与您的第一选择非常相似 - 将所有内容暴露给插件编写器并希望它们不会搞砸。这使得为​​Fiddler编写扩展非常简单,但它确实意味着你需要小心。

如果您对此方法不满意,我建议您仔细查看可能有用的2种.NET技术。

第一个是System.AddIn名称空间http://msdn.microsoft.com/en-us/library/gg145020.aspx。此命名空间中的类型旨在帮助您创建支持AddIns的应用程序。

第二个是MEF http://mef.codeplex.com/。 Managed Extensibility Framework是一个非常强大的API,用于描述应用程序需求,并允许您构建高度可扩展的应用程序。

关于MEF和WinForms,请查看这个问题:

Winforms with MEF

答案 1 :(得分:0)

第二种方法是可取的,您可以使用应用程序的所有可修改/可插入部分创建一个接口IApplication,并要求所有插件实现并IModifyApp与某些方法接口IModifyApp.Modify(IApplication) 1}}接受IApplication的一个实例并返回一个修改过的实例供应用程序处理。

您还应该查看MEF Microsoft托管扩展性框架。

答案 2 :(得分:0)

我之前为此类场景所做的事情是使用AppDomain。这就像您的主要流程中的流程。您可以在AppDomain中加载和卸载必须停止主进程的程序集,只要主进程知道从AppDomain中的“updates”dll加载的接口,就可以使用它没问题。如果没有,那么总会有反思:)

答案 3 :(得分:0)

您可能需要查看CAB / Prism之类的内容以满足您的需求。很多UI-y-ness(技术术语)都是通过一系列抽象来构建的。

http://compositewpf.codeplex.com/