【发布时间】:2016-05-07 09:53:15
【问题描述】:
我使用 MEF 和 FileSystemWatcher 编写了一个简单的插件管理器类,用于自动刷新插件,但我听到有人说要能够动态添加和删除程序集(插件),我们还需要使用 AppDomain。
谁能指导我何时需要同时使用 AppDomain 和 MEF(尤其是对于我的插件管理器场景)?
它们之间是什么关系?
【问题讨论】:
我使用 MEF 和 FileSystemWatcher 编写了一个简单的插件管理器类,用于自动刷新插件,但我听到有人说要能够动态添加和删除程序集(插件),我们还需要使用 AppDomain。
谁能指导我何时需要同时使用 AppDomain 和 MEF(尤其是对于我的插件管理器场景)?
它们之间是什么关系?
【问题讨论】:
简而言之,当您想要覆盖应用程序正在使用的 .dll 时,需要 AppDomain,并且该 AppDomain 必须指定 ShadowCopyFiles = "true"。
影子复制文件意味着 AppDomain 会将 .dll 复制到一个临时目录并从该临时目录加载它们,以便覆盖原始 .dll。
不幸的是,加载到任何 AppDomain 中的程序集无法卸载,除非包含它们的 AppDomain 被卸载。
考虑到这一点,刷新插件很困难,因为您必须 A) 卸载整个 AppDomain,这必然会卸载该 AppDomain 中的所有其他 .dll,或者 B) 允许加载相同 .dll 的新版本增加应用程序的内存占用。第二个选项还要求您的插件 .dll 具有强名称和不同的版本号,以便 MEF 识别差异并加载新的 .dll。
【讨论】: