.NET 4中的本机代码和托管代码

时间:2012-07-21 16:28:53

标签: .net

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

C:\的Windows \ Microsoft.NET \组件\ GAC_32

C:\的Windows \ Microsoft.NET \组件\ GAC_MSIL

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

3 个答案:

答案 0 :(得分:2)

如果使用AnyCPU平台编译程序集,则转到MSIL文件夹,如果使用x86平台编译它,则转到GAC_32。 More details here

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

答案 1 :(得分:1)

GAC_32和GAC_64包含混合模式程序集。包含托管代码和本机代码的程序集。它们是由C ++ / CLI编译器生成的代码生成的,C ++ / CLI编译器知道如何从托管代码轻松调用本机代码而无需使用pinvoke。汇编格式足够灵活,可以支持这两种代码。一个死的赠品是使用反汇编程序在全局命名空间中看到<Module>类。

鉴于它们包含本机代码,它们对机器架构有很强的依赖性。因此,您需要在64位计算机上单独复制程序集。 GAC_32和GAC_64文件夹存储这些单独的副本,CLR会根据流程的位数自动选择正确的副本。

没有那么多框架程序集是混合模式。 Mscorlib.dll是一个,它接近操作系统。 System.Data.dll对数据库提供程序具有很强的依赖性,这些提供程序仅在本机代码中可用。 WPF的PresentationCore.dll强烈依赖于Milcore,这是一个与DirectX接口的本机层。等等。

答案 2 :(得分:0)

体面的解释here

  

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

     

32/64目录包含特定于哪一个的程序集   32位或64位模式,因为它们包含本机代码或   因为他们对单词大小做出了具体的假设。

     

32位系统只有GAC_32目录。一个64位系统   因为通过仿真支持32位代码(WOW32)。

我知道有关NGen-ed程序集是否真的比MSIL更快的争论,因为在给定当前运行时条件(核心数,架构等)的情况下可以优化JIT编译程序集。