.NET JIT编译器只有一次机会加载程序集吗?

时间:2014-10-30 02:00:22

标签: .net jit

当JIT编译器需要一个尚未加载的程序集中的类型的类型定义,但加载器无法加载该程序集(例如FileNotFoundException或UnauthorizedAccessException)时,使用该类型的方法的JIT编译显然失败。

如果随后在同一个AppDomain中再次调用该方法,那么JIT编译器/加载器是否应该尝试再次加载程序集?

实验似乎表明JIT编译器只有一次加载程序集,对同一方法的每次后续调用都会产生相同的异常,即使导致该异常的原始条件得到解决(即文件)现在存在,或文件权限已更正)。

是否有关于JIT编译器或加载程序如何处理此类程序集加载失败的详细内部文档?

1 个答案:

答案 0 :(得分:0)

我不知道有关Microsoft的商业CLR在这种情况下的行为的任何文档。我怀疑它在ECMA规范中没有详细说明。

但是,Shared Source Common Language Infrastructure(SSCLI,又称Rotor)通过让JIT编译器发出代码来抛出异常来处理这种情况。这是一个非常简洁的解决方案,允许在执行托管代码时引发异常,而不是必须报告错误的未托管VM。

然后对调用站点进行反向修补以调用发出的代码,因此JIT不会再次尝试加载程序集,至少不会从该调用站点加载。

鉴于Rotor基于商业CLR,它似乎可能以类似的方式运行,但是也许有人可以验证它?