【问题标题】:Why are not all assemblies in GAC built as MSIL?为什么不是 GAC 中的所有程序集都构建为 MSIL?
【发布时间】:2015-01-11 23:29:15
【问题描述】:

不是全局程序集缓存 (GAC) 中的所有程序集都构建为 MSIL 的原因是什么?我看到 x86AMD64 体系结构类型用于某些程序集,如下例所示,但对于其他程序集则不然:

C:\Windows\assembly\

为什么System.Data 是为两种不同的处理器架构构建的,而System.CoreMSIL

C:\Windows\Microsoft.NET\assembly

在 GAC 的第二个版本中可以看到类似的模式,如上所示。程序集分为不同的架构,但并非所有程序都内置于32/64 版本中——有些只是MSIL

【问题讨论】:

  • 他们有针对架构的编译器优化和目标。对于更高版本的 .NET,这些优化混合在 C# 编译器中。

标签: .net gac gac-32 gac-64 gac-msil


【解决方案1】:

编译库时,您可以选择以“任何 CPU”或特定处理器架构为目标。

“任何 CPU”库只需要 GAC 中的一个条目,整个程序集将编译为 MSIL。

对于每个架构,其他程序集需要不同的库。这些库是为每种 CPU 类型构建的,在 GAC 中有多个副本。最常见的原因是包含非托管代码或加载特定于体系结构的本机 dll。

在您的示例中 System.Core 可能是完全托管的代码,而 System.Data 可能构建在一堆本机 Windows 库之上。

在 32 位模式下运行的应用程序将加载 32 位版本的库,而在 64 位模式下运行的应用程序将加载 64 位版本。

【讨论】:

  • 谢谢,有道理。
猜你喜欢
  • 2012-01-12
  • 2019-04-19
  • 1970-01-01
  • 1970-01-01
  • 2011-02-07
  • 2017-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多