【问题标题】:Implementing Plugin Architecture - Dynamic DLL loading实现插件架构 - 动态 DLL 加载
【发布时间】:2011-09-01 11:55:57
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我认为在较新版本的 .NET 中有一个插件框架...我会尝试为您找到它们,因为您可能应该走那条路。
  • 您也可以查看mef.codeplex.com

标签: c# .net asp.net dynamic-loading plugin-architecture


【解决方案1】:

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

您也绝对应该按照 mathieu 的建议查看 System.Addin 命名空间!

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

  • 主应用程序中的插件界面
  • 在插件 dll 中实现该接口
  • 在运行时使用Assembly.Load 加载dll
    • 您可能需要考虑将插件程序集加载到单独的 AppDomain 中

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • +1 我不知道有两个,我最终提出的 (MEF) 不是我想的 (MAF) - 谷歌今天早上无法读懂我的想法,要多喝咖啡:)
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-08-22
      • 2021-09-11
      • 1970-01-01
      • 2020-11-15
      • 2011-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多