【问题标题】:Does the .NET JIT compiler only get one chance to load an assembly?.NET JIT 编译器是否只有一次加载程序集的机会?
【发布时间】:2014-10-30 11:30:54
【问题描述】:

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

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

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

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

【问题讨论】:

  • 一枪。一旦组件加载失败,即使它不必失败,它也会在之后持续失败。标准 CLR 规则。不适用于没有上下文的加载 (LoadFile)。

标签: .net jit


【解决方案1】:

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

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

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

鉴于 Rotor 是基于商业 CLR 的,它的行为方式似乎很相似,但也许从事过它的人可以验证?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    • 2011-09-06
    • 1970-01-01
    • 2017-07-04
    相关资源
    最近更新 更多