2016-01-20 114 views
1

我正在设计一个解决方案,我相信它可以在插件式架构中很好地工作。c#在不重新启动的情况下添加/删除动态插件

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

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

我需要能够在没有重新启动“主程序”的情况下在运行时安装和卸载插件。当“插件”的新版本可用并需要添加到“主程序”时,卸载将主要发生。

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

如果我在程序集上执行Application.Load,卸载它的唯一方法是卸载整个AppDomain。我对AppDomain的工作方式不太了解,但这似乎会导致问题。

有没有人做过这种事情之前,可以提供一些建议最好的方式来做到这一点,而不会造成不稳定或内存泄漏?

回答

1

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

+0

这就是我的想法。希望有一个更好的方法来做到这一点,但有时候,漫长的道路我认为最终会更好。 – Kelly

+0

@Kelly你可以尝试找到一个库。但MEF是最受欢迎的插件库,不适用于appdomains。我几乎肯定Github上有一些例子。 –

+0

谢谢我已经使用了MEF合理的数量,你的权利,这不正是我在这里寻找。我有足够的时间来窥探,看看我能找到什么。 – Kelly