【问题标题】:c# Add/Remove Dynamic Plugins without restartc# 添加/删除动态插件而不重启
【发布时间】:2016-01-20 20:31:38
【问题描述】:

我正在设计一个解决方案,我相信它可以在插件式架构中运行良好。

“主程序”将提供诸如数据库访问、向远程客户端发送消息、日志记录和其他功能等服务。

每个“插件”都将能够使用这些函数并包含将执行“插件”特定逻辑的自定义函数。

我需要能够在运行时安装和卸载插件,而无需重新启动“主程序”。卸载主要发生在新版本的“插件”可用并且需要添加到“主程序”中。

如果我将每个插件创建为 DLL 并将其放在一个文件夹中,我可以向“主程序”发出信号以加载它们,一切都很好。我不确定如何在不再需要时正确卸载它们,而不会造成内存泄漏。

如果我对程序集执行 Application.Load,则卸载它的唯一方法是卸载整个 AppDomain。我对 AppDomains 的工作方式不是很熟悉,但这似乎会导致问题。

以前有没有人做过这种事情,并且可以就如何做到这一点提供一些建议,而不会造成不稳定或内存泄漏?

【问题讨论】:

    标签: c# plugins architecture


    【解决方案1】:

    通常,您需要将每个插件加载到其自己的 AppDomain 中。没有其他方法可以使其可卸载。它不会造成任何内存泄漏(如果您自己不制造它们)。如果你实施得当,它是稳定的。这不是一件容易的事,但是这个话题太大了,无法详细解释,还不如写一篇大文章或一本书。

    【讨论】:

    • 我就是这么想的。希望有更好的方法来做到这一点,但有时我认为漫长的道路最终会更好。
    • @Kelly 您可以尝试为此找到一个库。但是 MEF,最流行的插件库,不适用于 appdomains。我几乎可以肯定 Github 上有一些例子。
    • 谢谢,我已经使用了合理数量的 MEF,但您的权利并不完全是我在这里寻找的。我有足够的时间四处窥探,看看我能找到什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-20
    • 1970-01-01
    相关资源
    最近更新 更多