.NET程序集缓存对其他程序集的引用吗?

时间:2012-07-09 19:00:27

标签: .net reflection assemblies typechecking

这可能听起来像一个奇怪的问题(至少,我至今没有理由去考虑它),但让我解释一下我的情况。

我们有一个服务应用程序,可以在我们客户网络的服务器上运行。为了更新应用程序,我们将服务核心程序集的新版本推送到我们的服务器,并向服务应用程序发出软重启,这实际上只是核心的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);
}

我想,当从插件下面更改核心程序集时,插件没有获得有关新核心程序集的备忘录,并继续使用旧程序集的“缓存”引用。但我真的不知道这种情况在记忆中如何发挥作用,我也不知道如何解决这种情况。

有问题吗?思考?谢谢大家!

0 个答案:

没有答案