6

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

我计划在未来发布越来越多的控件。我不想为新添加的控件发布新版本,因为它有其缺点。所以我在考虑插件/插件类型的架构,我只需单独发布插件/插件,他们可以安装并获取设计器内部的控件。

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

相反,我可以为每个插件发布一个 dll,让我有更多的控制权来编写代码来定义控件的行为/外观并通过主引擎动态加载它吗?如果是这样,我如何检查 dll 并将其动态加载到我的应用程序中?

4

3 回答 3

12

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

你也应该System.Addin像 mathieu 建议的那样研究命名空间!

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

  • 主应用程序中的插件界面
  • 在插件 dll 中实现该接口
  • 在运行时加载 dllAssembly.Load
    • 您可能想考虑将插件程序集加载到单独的 AppDomain
于 2011-05-25T06:35:17.990 回答
4

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

请参阅此问题进行比较:在 MEF 和 MAF (System.AddIn) 之间选择

于 2011-05-25T06:51:05.037 回答
1

提到的 MEF 或 System.Addins 路由可能是解决此问题的最有效方法。我只是插嘴说一些关于替代品的事情。

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

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

于 2011-05-25T07:00:58.033 回答