【问题标题】:Is there a way to give a plugin control of parts of an application directly in C#?有没有办法让插件直接在 C# 中控制应用程序的某些部分?
【发布时间】:2010-11-23 22:24:17
【问题描述】:

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

我的原因是我希望能够动态地将按钮和菜单项等内容添加到表单中,而不是让我更新一个名为“插件”的菜单项。这样我就可以在应用程序 GUI 中添加内容,而无需再次释放整个应用程序。

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

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

感谢所有帮助、建议、网站参考和 cmets。

【问题讨论】:

    标签: c# .net plugins


    【解决方案1】:

    这部分取决于谁将编写您的插件,您是否信任他们,以及当插件出现问题时用户的体验或数据会发生什么变化?

    Fiddler http://www.fiddler2.com/fiddler2/ 是一个 Web 调试代理,它的插件模型非常类似于您的首选 - 向插件作者公开所有内容,并希望他们不要搞砸。这使得为​​ Fiddler 编写扩展非常简单,但这确实意味着您需要小心。

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

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

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

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

    Winforms with MEF

    【讨论】:

      【解决方案2】:

      第二种方法更可取,您可以创建一个接口IApplication,其中包含您应用程序的所有可修改/可插入部分,并要求所有插件实现和IModifyApp接口与IModifyApp.Modify(IApplication)之类的方法IApplication 的实例并返回一个修改后的实例供应用程序处理。

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

      【讨论】:

        【解决方案3】:

        我之前为这种场景所做的就是使用 AppDomain。这就像您的主要流程中的一个流程。您可以在 AppDomain 中加载和卸载程序集,而不必停止主进程,并且只要您的主进程知道从 AppDomain 内的“更新”dll 加载的接口,它就可以毫无问题地使用它。如果没有,那么总会有反思:)

        【讨论】:

          【解决方案4】:

          您可能想看看 CAB/Prism 之类的东西来满足您的需求。许多 UI-y-ness(技术术语)是通过一系列抽象内置于其中的。

          http://compositewpf.codeplex.com/

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-11-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-08-05
            相关资源
            最近更新 更多