有没有一种方法可以使用插件系统(我会使用IoC容器)在运行时加载一个版本的程序集,然后在AppDomain运行时替换该DLL?我不想重新启动应用程序。
MEF会做这样的事吗?
答案 0 :(得分:3)
这基本上就是NUnit所做的事情(或者至少做过,我有一段时间没有参与过代码)。但它是通过在另一个AppDomain中加载测试程序集,使用AppDomain的DoCallback
方法调用该域中的代码然后重新加载测试程序集来实现的。
因此,虽然您无法卸载或重新加载DLL,但您可以卸载并重新加载appdomain并在其中执行代码。
答案 1 :(得分:1)
使用纯.net是不可能的,因为无法从域卸载程序集。由于MEF是用托管代码编写的,我怀疑它是否可行。我通过将程序集加载到单独的域来解决了这个问题,当我想重新加载它时,我停止了它并重新开始。
答案 2 :(得分:1)
答案 3 :(得分:0)
看起来这篇CodeProject文章解释了如何做到这一点。 MSDN Forums上的这个问题似乎很相似,而SO question显示了如何做到这一点。所有这些链接都警告正确处理AppDomains时出现的泄漏,所以买家要小心。
答案 4 :(得分:0)
您无法在正在运行的应用域中卸载dll。你可以做的是使用MEF并准备你的应用程序来处理多个实现。在这种情况下,您可以将新的dll(接口,模块等的新实现)复制到MEF文件夹中,重新构建并使用它。但是,小心,它会耗费你的记忆。
您可以阅读并下载示例here。