这听起来可能是一个奇怪的问题(至少,直到现在我还没有理由考虑它),但让我解释一下我的情况。
我们有一个在客户网络上的服务器上运行的服务应用程序。为了更新应用程序,我们将服务核心程序集的新构建推送到我们的服务器,并向服务应用程序发出软重启,这实际上只是核心的外壳。各个服务应用程序请求核心程序集的字节数组并执行新程序集:
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 { ... }
}
在汇编插件测试中:
namespace PluginTest
{
public class PluginA : Core.IWorker { ... }
}
之前在服务应用程序的初始加载中找到的所有工作人员在软重启后不再找到,因为 (new)Core.IWorker 不再可从插件工作人员类型分配。尽管调试器不同意,并以我希望的方式评估对 IsAssignableFrom 的调用,但 CLR 正在做一些不同的事情,导致检查失败:
foreach(var t in pluginAsm.GetTypes())
{
if(otherChecksPass && typeof(IWorker).IsAssignableFrom(t))
RegisterPluginType(t);
}
我想,当从插件下更改核心程序集时,插件不会获得关于新核心程序集的备忘录,并继续使用对旧程序集的“缓存”引用。但我真的不知道这种情况在记忆中是如何发生的,我也不知道我将如何解决这种情况。
问题?想法?谢谢你们!