先看看gacutil -l的结果:
Microsoft (R) .NET Global Assembly Cache Utility. Version 2.0.40607.16
Copyright
Microsoft Corporation. All rights reserved.
The Global Assembly Cache contains the following assemblies:
CustomMarshalers, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=x86
ISymWrapper, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=x86
Microsoft.VisualC, Version=8.0.1200.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=x86
mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, ProcessorArchitecture=x86
System.Data, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=x86
System.Data.OracleClient, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=x86
System.EnterpriseServices, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=x86
System.Transactions, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=x86
Accessibility, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL
apphost, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL
AspNetMMCExt, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL
cscompmgd, Version=8.0.1200.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL
EnvDTE80, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL
IEExecRemote, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL
IEHost, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL
IIEHost, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL
Microsoft.Build.Engine, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL
Microsoft.Build.Framework, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL
Microsoft.Build.Tasks, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL
< The rest is omitted>
Accessibility, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
ADODB, Version=7.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
ConMan, Version=7.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
ConManDataStore, Version=7.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
ConManServer, Version=7.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
< The rest is omitted>
你可以看到,GAC里的Assemblies的名字,除了name, version, culture, publicKeyToken, 又加了一个processorArchitecture. 而gacutil的结果里,有的显示processorArchitecture=x86, 有的显示processorArchitecture=MSIL,有的没有processorArchitecture。
加入processorArchitecture是为了支持64位。绝大多数Assemblies都是processorArchitecture neutral的。同一个程序既可以在32位上运行,也能在64位上运行。这些assemblies包括所有的C#,VB.NET,和一部分Managed C++ assemblies。它们的processorArchitecture是MSIL(之所以叫MSIL而不是neutral,是因为neutral有别的意思)。而绝大多数的Managed C++ assemblies,因为它们同时包括Managed 和unmanaged的代码,它们必须编译两遍。一次32位的,一次64位的。在64位的OS里,如果32位的assembly和64位的assembly要共存的话,必须要有什么区分它们,这就是processorArchitecture。(C#\VB.Net assemblies 如果用了P/Invoke的话也有可能需要编译成processorArchitecture specific assembly)。
在beta1里processorArchitecture只在Fusion里存在。在System.Reflection.AssemblyName里暂时还不存在。在beta2里应该能看到System.Reflection.AssemblyName 加入processorArchitecture。
用1.1和1.0编译的assemblies,没有processorArchitecture。在64位的OS里它们只能以32位的方式运行。
微软的编译器都提供了选项编译成64位或者是32位的assembly。 比如C#,
H:\WINDOWS\Microsoft.NET\Framework\v2.0.40607>csc /?
Microsoft (R) Visual C# .NET Compiler version 8.00.40607.16
for Microsoft (R) Windows (R) .NET Framework version 2.0.40607
Copyright
Microsoft Corporation 2001-2003. All rights reserved.
Visual C# .NET Compiler Options
- OUTPUT FILES -
/out:<file> Output file name (default: base name of file with
main class or first file)
/target:exe Build a console executable (default) (Short form:
/t:exe)
/target:winexe Build a Windows executable (Short form: /t:winexe)
/target:library Build a library (Short form: /t:library)
/target:module Build a module that can be added to another
assembly (Short form: /t:module)
/delaysign[+|-] Delay-sign the assembly using only the public
portion of the strong name key
/doc:<file> XML Documentation file to generate
/keyfile:<file> Specifies a strong name key file
/keycontainer:<string> Specifies a strong name key container
/platform:<string> Limit which platforms this code can run on: x86,
Itanium, x64, or anycpu. The default is anycpu.
<The rest is omitted>