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

.net NET 4中的本机代码和托管代码,.net,.net,.NET 4全局程序集缓存分为两个文件夹: C:\Windows\Microsoft.NET\assembly\GAC\U 32 C:\Windows\Microsoft.NET\assembly\GAC\MSIL 我对GAC_32文件夹很感兴趣。我是否应该假定此文件夹中的程序集(如System.Data)是本机代码而不是托管代码?它是x86专用的吗?如果您使用任何CPU平台编译程序集,它将转到MSIL文件夹,如果您使用x86平台编译它,它将转到GAC_32 您可以使用来确定程序集是x86、x6

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

C:\Windows\Microsoft.NET\assembly\GAC\U 32

C:\Windows\Microsoft.NET\assembly\GAC\MSIL


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

如果您使用任何CPU平台编译程序集,它将转到MSIL文件夹,如果您使用x86平台编译它,它将转到GAC_32

您可以使用来确定程序集是x86、x64还是任意CPU

GAC_MSIL缓存包含可以在以下任一种方式中运行的程序集: 32位或64位模式,并被JIT编译为所需的字大小 根据需要

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

32位系统将仅具有GAC_32目录。64位系统 由于通过仿真(WOW32)支持32位代码,因此两者都有


我知道对于NGen ed程序集是否真的比MSIL快,存在一些争论,因为JIT ed程序集可以在当前运行时条件下(内核、体系结构等)进行优化。

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

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


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

请花点时间接受您的问题的一些答案。我通常不会发表这样的评论(我很不喜欢),但25%的接受率很低。关于最后一段(性能):IIRC
ngen
“加载的程序集可能不会运行得更快,但加载得更快。是的,但它们可能运行得更慢。我想这就是交易。