.NET 4 全局程序集缓存分为 2 个文件夹:
C:\Windows\Microsoft.NET\程序集\GAC_32
C:\Windows\Microsoft.NET\程序集\GAC_MSIL
我对 GAC_32 文件夹很感兴趣。我是否应该假设此文件夹中的程序集(如 System.Data)是本机代码而不是托管代码?它是特定于 x86 的吗?
.NET 4 全局程序集缓存分为 2 个文件夹:
C:\Windows\Microsoft.NET\程序集\GAC_32
C:\Windows\Microsoft.NET\程序集\GAC_MSIL
我对 GAC_32 文件夹很感兴趣。我是否应该假设此文件夹中的程序集(如 System.Data)是本机代码而不是托管代码?它是特定于 x86 的吗?
GAC_32 和 GAC_64 包含混合模式程序集。包含托管代码和本机代码的程序集。它们由 C++/CLI 编译器生成的代码生成,该编译器知道如何轻松地从托管代码调用本机代码,而无需使用 pinvoke。汇编格式足够灵活,可以支持这两种代码。一个致命的赠品是<Module>
使用反汇编程序在全局命名空间中查看该类。
鉴于它们包含本机代码,它们对机器架构有很强的依赖性。因此,您需要在 64 位机器上单独复制程序集。GAC_32 和 GAC_64 文件夹存储这些单独的副本,CLR 会根据进程的位数自动选择正确的副本。
混合模式的框架程序集并不多。Mscorlib.dll 就是其中之一,它接近于操作系统。System.Data.dll 对数据库提供程序有很强的依赖性,这些数据库提供程序都只能在本机代码中使用。WPF 的 PresentationCore.dll 对 Milcore 有很强的依赖性,Milcore 是一个与 DirectX 接口的本机层。等等。
体面的解释在这里。
GAC_MSIL 缓存包含可以在 32 位或 64 位模式下运行的程序集,并根据需要被 JIT 编译为所需的字长。
32/64 目录包含特定于 32 位或 64 位模式的程序集,因为它们包含本机代码,或者因为它们对字长做出特定假设。
32 位系统将只有 GAC_32 目录。64 位系统将两者兼有,因为通过仿真 (WOW32) 支持 32 位代码。
我知道关于 NGen 版程序集是否真的比 MSIL 快存在一些争论,因为可以根据当前运行时条件(内核数、架构等)优化 JIT 版程序集。