CLR是否仍然在该过程中加载程序集,即使它具有该程序集的Ngen副本

时间:2015-06-14 14:41:08

标签: c# .net .net-assembly

我正在读杰弗里里希特的一篇文章'通过C#预订 CLR。我发现了一个关于NGen.exe工具的好段落。

  

许多人认为可能会发送NGen文件   因此,不包含包含原始IL代码的文件   保密他们的知识产权。不幸的是,这是   不可能。在运行时,CLR需要访问程序集   元数据(用于反射和序列化等功能);这个   要求包含IL和元数据的程序集。

我只想澄清一些事情。

  1. 当程序集中存在引用类型时,CLR是否始终加载程序集。
  2. 是否对其进行验证检查?
  3. 在编译代码(JIT编译器)时,它是否寻找NGen代码并从该文件加载已编译的本机CPU指令,或者在NGen&#时根本不加载程序集39; d文件已经存在?

1 个答案:

答案 0 :(得分:2)

  

CLR总是在引用类型时加载程序集   在集会中。

没有。一旦方法被JITTED,CLR将加载程序集,并且依赖于程序集以便执行。 JIT将指示运行时加载该DLL。

  

是否对它进行验证检查?

是的,负责加载dll的活页夹将通过它在CLR标题中的元数据将其验证为有效的程序集(参见下面的部分)。

  

在编译代码(JIT编译器)时,它是否会寻找   NGen代码并从中加载编译的本机CPU指令   文件,或者当NGen文件已经存在时根本不加载程序集   有?

不确定" NGENED文件已经存在" 的含义,但本机绑定器将在加载过程中查找本机dll。 This article解释了将程序集加载到详细信息的详细信息:

  
      
  1. 首先,标准的融合器将启动以找到该组件。   它可以在:

    中找到它      
        
    • GAC,这意味着它的名字很强。文件放置在GAC中的方式可确保绑定器可以提取所需的全部内容   有关装配的信息,无需实际打开文件

    •   
    • 找到APPBASE(例如program.exe的本地文件夹)。它将继续打开IL文件并读取程序集元数据。

    •   
  2.   
  3. 本机绑定仅在默认上下文中进行(更多关于   这在后面的文章中)
  4.   
  5. NativeBinder从NIC中找到NI文件。它读入NI   文件详细信息和元数据
  6.   
  7. 验证NI确实适用于同样的IL组件。为了那个原因   它经历了严格的匹配过程,包括(但不是   限于)完整的程序集名称匹配(同名,版本,公共   关键令牌,文化),时间戳匹配(NI必须比新的更新   IL),MVID(见下文)
  8.   
  9. 还验证NI是否已针对同一CLR生成   它将被运行(确切的.NET版本,处理器类型,   等......)。
  10.   
  11. 还确保NI的依赖关系也有效。例如。什么时候   NI生成它绑定特定版本的   mscorlib程序。如果该mscorlib原生图像无效,那么这个NI   图像也被拒绝
  12.   

默认上下文

  

默认上下文:这是通过隐式程序集引用加载程序集或Assembly.Load(...)调用land的上下文