程序集的名称存储在元数据中,对程序集的范围和应用程序使用产生重大影响。 强名称程序集有一个完全限定的名称,由程序集的名称、区域性、公钥、版本号以及(可选)处理器体系结构组成。 使用 FullName 属性获取加载程序集的完全限定名称(通常称为显示名称)。
运行时使用名称信息来查找程序集,并将其与其他同名程序集区分开来。 例如,名为 myTypes
的强名称程序集可以具有下列完全限定名:
myTypes, Version=1.0.1234.0, Culture=en-US, PublicKeyToken=b77a5c561934e089c, ProcessorArchitecture=msil
在此例中,完全限定名称表明 myTypes
程序集的强名称具有公钥标记、区域性值为美国英语、版本号为 1.0.1234.0。 它的处理器体系结构 msil
意味着它将被实时(JIT,即时编译)编译为 32 位代码或 64 位代码,这取决于操作系统和处理器。
小窍门
ProcessorArchitecture
信息允许特定于处理器的程序集版本。 可以创建一个程序集的版本,其标识仅因处理器体系结构而异,例如 32 位和 64 位处理器特定的版本。 处理器体系结构对于强名称不是必需的。 有关详细信息,请参阅 AssemblyName.ProcessorArchitecture。
请求程序集中的类型的代码必须使用完全限定的程序集名称。 这称为完全限定绑定。 在 .NET Framework 中引用程序集时,不允许仅指定程序集名称的分部绑定。
对组成 .NET Framework 的程序集的所有程序集引用还必须包含程序集的完全限定名称。 例如,对版本 1.0 的 System.Data .NET Framework 程序集的引用将包括:
System.data, version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
版本对应于 .NET Framework 版本 1.0 附带的所有 .NET Framework 程序集的版本号。 对于 .NET Framework 程序集,区域性值始终不是特定的,公钥与上例中所示公钥相同。
例如,若要在配置文件中添加程序集引用以设置跟踪侦听器,需要包括系统 .NET Framework 程序集的完全限定名称:
<add name="myListener" type="System.Diagnostics.TextWriterTraceListener, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" initializeData="c:\myListener.log" />
注释
绑定到程序集时,运行时不区分程序集名称的大小写,但会保留程序集名称中使用的大小写。 Windows SDK 中的多个工具将程序集名称区分大小写处理。 为获得最佳效果,管理程序集名称时请按区分大小写的方式来处理。
命名应用程序组件
在确定程序集的标识时,运行时不考虑文件名。 程序集标识(由程序集名称、版本、区域性和强名称组成)对运行时必须清楚明了。
例如,如果你有一个名为 myAssembly.exe 引用名为 myAssembly.dll的程序集的程序集,则执行 myAssembly.exe时,绑定将正确发生。 但是,如果另一个应用程序执行myAssembly.exe时使用该方法AppDomain.ExecuteAssembly,运行时将在myAssembly
请求绑定到时确定myAssembly
已加载。 在这种情况下,永远不会加载 myAssembly.dll 。 由于 myAssembly.exe 不包含请求的类型,因此会发生 TypeLoadException 错误。
若要避免此问题,请确保构成应用程序的程序集没有相同的程序集名称,或将具有相同名称的程序集放置在不同的目录中。
注释
在 .NET Framework 中,如果将强名称程序集放在全局程序集缓存中,则程序集的文件名必须与程序集名称匹配,不包括文件扩展名,如 .exe 或 .dll。 例如,如果程序集的文件名 myAssembly.dll,则程序集名称必须为 myAssembly
。 仅在根应用程序目录中部署的专用程序集可以具有不同于文件名的程序集名称。