我正在读杰弗里里希特的一篇文章'通过C#预订 CLR。我发现了一个关于NGen.exe
工具的好段落。
许多人认为可能会发送NGen文件 因此,不包含包含原始IL代码的文件 保密他们的知识产权。不幸的是,这是 不可能。在运行时,CLR需要访问程序集 元数据(用于反射和序列化等功能);这个 要求包含IL和元数据的程序集。
我只想澄清一些事情。
答案 0 :(得分:2)
CLR总是在引用类型时加载程序集 在集会中。
没有。一旦方法被JITTED,CLR将加载程序集,并且依赖于程序集以便执行。 JIT将指示运行时加载该DLL。
是否对它进行验证检查?
是的,负责加载dll的活页夹将通过它在CLR标题中的元数据将其验证为有效的程序集(参见下面的部分)。
在编译代码(JIT编译器)时,它是否会寻找 NGen代码并从中加载编译的本机CPU指令 文件,或者当NGen文件已经存在时根本不加载程序集 有?
不确定" NGENED文件已经存在" 的含义,但本机绑定器将在加载过程中查找本机dll。 This article解释了将程序集加载到详细信息的详细信息:
首先,标准的融合器将启动以找到该组件。 它可以在:
中找到它
GAC,这意味着它的名字很强。文件放置在GAC中的方式可确保绑定器可以提取所需的全部内容 有关装配的信息,无需实际打开文件
找到APPBASE(例如program.exe的本地文件夹)。它将继续打开IL文件并读取程序集元数据。
- 本机绑定仅在默认上下文中进行(更多关于 这在后面的文章中)
- NativeBinder从NIC中找到NI文件。它读入NI 文件详细信息和元数据
- 验证NI确实适用于同样的IL组件。为了那个原因 它经历了严格的匹配过程,包括(但不是 限于)完整的程序集名称匹配(同名,版本,公共 关键令牌,文化),时间戳匹配(NI必须比新的更新 IL),MVID(见下文)
- 还验证NI是否已针对同一CLR生成 它将被运行(确切的.NET版本,处理器类型, 等......)。
- 还确保NI的依赖关系也有效。例如。什么时候 NI生成它绑定特定版本的 mscorlib程序。如果该mscorlib原生图像无效,那么这个NI 图像也被拒绝
醇>
默认上下文:
默认上下文:这是通过隐式程序集引用加载程序集或Assembly.Load(...)调用land的上下文