实现插件架构-动态DLL加载

问题描述 投票:0回答:3

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

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

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

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

c# .net asp.net dynamic-loading plugin-architecture
3个回答
12
投票

您可能想查看托管可扩展性框架。这可能会解决您的大部分问题甚至更多问题,但需要学习一些新技术......

您还应该按照 mathieu 的建议查看

System.Addin
命名空间!

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

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

4
投票

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

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


1
投票

提到的 MEF 或 System.Addins 路由可能是实现此目的的最有效方法。我只是插话来说一些关于替代方案的事情。

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

另外,根据您想要做的事情的类型,嵌入宏语言的方法可能很有用。 Iron Python 很容易嵌入。 Ayende 写了一本非常有趣的书 DSLs in Boo 关于做这类事情以及更多。

© www.soinside.com 2019 - 2024. All rights reserved.