2

.NET 4 全局程序集缓存分为 2 个文件夹:

C:\Windows\Microsoft.NET\程序集\GAC_32

C:\Windows\Microsoft.NET\程序集\GAC_MSIL

我对 GAC_32 文件夹很感兴趣。我是否应该假设此文件夹中的程序集(如 System.Data)是本机代码而不是托管代码?它是特定于 x86 的吗?

4

3 回答 3

2

如果你用 AnyCPU 平台编译一个程序集,它会转到 MSIL 文件夹,如果你用 x86 平台编译它,它会转到 GAC_32。更多细节在这里

您可以使用CorFlags来确定程序集是 x86、x64 还是 AnyCPU

于 2012-07-21T16:31:44.820 回答
1

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 接口的本机层。等等。

于 2012-07-21T17:21:02.533 回答
0

体面的解释在这里

GAC_MSIL 缓存包含可以在 32 位或 64 位模式下运行的程序集,并根据需要被 JIT 编译为所需的字长。

32/64 目录包含特定于 32 位或 64 位模式的程序集,因为它们包含本机代码,或者因为它们对字长做出特定假设。

32 位系统将只有 GAC_32 目录。64 位系统将两者兼有,因为通过仿真 (WOW32) 支持 32 位代码。

我知道关于 NGen 版程序集是否真的比 MSIL 快存在一些争论,因为可以根据当前运行时条件(内核数、架构等)优化 JIT 版程序集。

于 2012-07-21T16:35:54.757 回答