这可能听起来像一个奇怪的问题(至少,我至今没有理由去考虑它),但让我解释一下我的情况。
我们有一个服务应用程序,可以在我们客户网络的服务器上运行。为了更新应用程序,我们将服务核心程序集的新版本推送到我们的服务器,并向服务应用程序发出软重启,这实际上只是核心的shell。各个服务应用程序请求核心程序集的字节数组并执行新程序集:
Assembly coreAsm = Assembly.Load(coreAsmByteArray);
Type tCoreHelper = GetInterfaceTypeFromAssembly(coreAsm, typeof(ICoreHelper));
_CoreHelper = Activator.CreateInstance(tCoreHelper) as ICoreHelper;
_CoreHelper.Start();
服务执行所需的一切都包含在核心程序集中,直到最近。
我们刚刚做了一些更改,也允许服务应用程序请求插件程序集。当服务首次运行时,它会请求核心程序集,并且核心请求插件并以与核心相同的方式加载它们(假设不同且正确的类型)。装配重新加载,一切都很愉快。但是,当我们发出软重启时,请求核心程序集,并且核心程序集请求插件。核心和插件程序集已成功加载,但插件和核心类型之间的类型检查开始失败。
加载插件程序集后,我们仔细阅读插件的类型,查找工作类IWorker,它是核心程序集中定义的类型(意味着所有插件程序集都引用了核心):
在汇编核心:
namespace Core
{
public interface IWorker { ... }
}
在程序集PluginTest中:
namespace PluginTest
{
public class PluginA : Core.IWorker { ... }
}
在软重启后,以前在服务应用初始加载时找到的所有工作人员都不再找到,因为(新)Core.IWorker不再可以从插件工作者类型中分配。虽然调试器不同意,并以我想要的方式评估对IsAssignableFrom的调用,但CLR正在做一些不同的事情,导致检查失败:
foreach(var t in pluginAsm.GetTypes())
{
if(otherChecksPass && typeof(IWorker).IsAssignableFrom(t))
RegisterPluginType(t);
}
我想,当从插件下面更改核心程序集时,插件没有获得有关新核心程序集的备忘录,并继续使用旧程序集的“缓存”引用。但我真的不知道这种情况在记忆中如何发挥作用,我也不知道如何解决这种情况。
有问题吗?思考?谢谢大家!