程序集是 .NET Framework 的生成块,它们构成基本部署单元、版本控制、重新使用、激活范围和安全权限。
程序集向公共语言运行库提供了解类型实现所需要的信息。它是为共同运行和形成功能逻辑单元而生成的类型和资源的集合。
对于运行库,类型不存在于程序集上下文之外。本节描述:
如何创建模块,
如何从模块创建程序集,
如何创建密钥对并使用强名称为程序集签名,
以及如何将程序集安装至全局程序集缓存。
如何使用 MSIL 反汇编程序 (Ildasm.exe) 查看程序集清单信息。
您可以从几个代码模块和资源文件中创建多文件程序集。也可以创建可由多个应用程序共享的程序集。共享的程序集必须具有强名称,并且可以在全局程序集缓存中部署。
将代码模块和资源分组为程序集时会有多个选项,这取决于以下因素:
版本控制
将应具有相同版本信息的模块分组。
部署
将支持部署模型的代码模块和资源分组。
重复使用
将可在逻辑上一起使用以达到某目的模块分组。例如,程序维护时不经常使用的类型和类组成的程序集可以放在同一程序集中。此外,计划要与多个应用程序共享的类型应分组为程序集,并且程序集应使用强名称签名。
安全性
将包含要求相同安全权限的类型的模块分组。
限定范围
将包含其可见性应限于相同程序集的类型的模块分组。
运行库使用这些信息来定位程序集并将其同其他同名的程序集区分开。例如,名为 myTypes 的强名称程序集可以具有下列完全限定名:
myTypes, Version=1.0.1234.0, Culture=en-US, PublicKeyToken=b77a5c561934e089c, ProcessorArchitecture=msil
在此例中,完全限定名表明 myTypes 程序集的强名称具有公钥标记、区域性值为美国英语、版本号为 1.0.1234.0。它的处理器架构为“msil”,表示程序集将以实时 (JIT) 方式编译为 32 位代码或 64 位代码,取决于操作系统和处理器。
1.使用 .NET Framework 配置工具 (Mscorcfg.msc)。
2.查看全局程序集缓存目录。
3.使用 全局程序集缓存工具 (Gacutil.exe)。
应用程序的目录或子目录
这是部署程序集最常用的位置。应用程序根目录的子目录可以基于语言或区域性。如果程序集具有区域属性中的信息,则它必须位于带有区域性名称的应用程序目录下的子目录中。
全局程序集缓存
这是安装于公共语言运行库安装位置的计算机内的代码缓存。大多数情况下,如果要与多个应用程序共享程序集,则应将程序集部署到全局程序集缓存中。
在 FTTP 服务器上
部署在 FTTP 服务器上的程序集必须具有强名称,请在应用程序配置文件的基本代码区域中指向此程序集。
程序集标识属性。
信息性属性。
程序集清单属性。
强名称属性。
程序集标识属性
程序集标识属性与强名称属性(如果适用)一起决定程序集的标识:名称、版本和区域性。这些属性构成程序集的完整名称,并且在代码中引用程序集时需要这些属性。
您可以使用属性来设置程序集的版本和区域性。编译器或程序集链接器 (Al.exe) 根据包含程序集清单的文件在创建程序集时设置名称值。
AssemblyCultureAttribute 枚举的字段表明程序集支持的区域性。程序集也可以指定区域独立性,表明它包含用于默认区域性的资源。
AssemblyFlagsAttribute 设置程序集属性(例如,程序集是否可以并行运行)的值。
AssemblyVersionAttribute major.minor.build.revision 格式的数值。例如,2.4.0.0。公共语言运行库使用此值在强名称程序集中执行绑定操作。
信息性属性
使用信息性属性为程序集提供公司或产品信息。下表描述了可应用于程序集的信息性属性。
AssemblyCompanyAttribute 指定公司名称的字符串值。
AssemblyCopyrightAttribute 指定版权信息的字符串值。
AssemblyFileVersionAttribute 指定 Win32 文件版本号的字符串值。默认值通常是程序集版本。
AssemblyInformationalVersionAttribute 指定运行时不使用的版本信息的字符串值,例如,完整的产品版本号。
AssemblyProductAttribute 指定产品信息的字符串值。
AssemblyTrademarkAttribute 指定商标信息的字符串值。
程序集清单属性
您可以使用程序集清单属性在程序集清单中提供信息,包括标题、说明、默认别名和配置。下面的表格描述了程序集清单的属性。
AssemblyConfigurationAttribute 表明程序集配置的字符串值,例如 Retail 或 Debug。运行时不使用此值。
AssemblyDefaultAliasAttribute 指定引用程序集要使用的默认别名的字符串值。此值在程序集本身的名称不友好时提供友好名称,例如 GUID 值。此值也可以用作完整程序集名称的缩写。
AssemblyDescriptionAttribute 指定总结程序集的特性和作用的简短说明的字符串值。
AssemblyTitleAttribute 为程序集指定友好名称的字符串值。例如,名为 comdlg 的程序集可以有标题“Microsoft Common Dialog 控件”。
强名称属性
您可以使用强名称属性为程序集设置强名称。下面的表格描述了强名称属性。
AssemblyDelaySignAttribute 表明正在使用延迟签名的 Boolean 值。
AssemblyKeyFileAttribute 表明文件名称的字符串值,此文件中或者只包含了公钥(如果使用延迟签名),或者包含了公钥和私钥都,公钥和私钥作为参数传递至此属性的构造函数。请注意,文件名称与输出文件路径(.exe 或 .dll)相关,与源文件路径无关。
AssemblyKeyNameAttribute 表明包含密钥对(作为参数传递至此属性的构造函数)的密钥容器
强名称方案
面的方案说明了使用强名称对程序集签名及以后按照该名称引用它的过程。
1.使用以下方法之一创建强名称程序集 A:
使用支持创建强名称(如 Visual Studio 2005)的开发环境
1.开发环境或工具使用开发人员私钥对包含程序集清单的文件哈希签名。该数字签名存储在包含程序集 A 的清单的可移植可执行 (PE) 文件中。
2.程序集 B 是程序集 A 的使用者。程序集 B 的清单的引用部分包括代表程序集 A 公钥的标记。标记是完整公钥的一部分,并且这种标记(而不是密钥本身)可用于节省空间。
3.公共语言运行库在程序集放在全局程序集缓存时验证强名称签名。当运行时强名称进行绑定时,公共语言运行库会将存储在程序集 B 的清单中的密钥与用于为程序集 A 生成强名称的密钥进行比较。如果 .NET Framework 安全检查通过并且绑定成功,则程序集 B 可保证程序集 A 的位未被篡改,而这些位实际来自程序集 A 的开发人员。
如何:创建公钥/私钥对
创建密钥对
在命令提示处,键入下列命令:
sn –k <file name>
在此命令中,“文件名”是包含密钥对的输出文件的名称。
从密钥对中提取公钥
sn -p keypair.snk public.snk
如何:使用强名称对程序集签名
Windows 软件开发工具包 (SDK) 提供了多种方法来使用强名称为程序集签名:
1.使用 Windows SDK 提供的程序集链接器 (Al.exe)。
2.使用程序集属性将强名称信息插入代码中。您可以使用 AssemblyKeyFileAttribute 或 AssemblyKeyNameAttribute,这取决于要使用的密钥文件所在的位置。
说明:在 .NET Framework 2.0 版中,有些编译器会在参数已被使用时发出警告消息。
3.使用诸如 C# 和 Visual Basic 中的 /keyfile 或 /delaysign 编译器选项,或者 C++ 中的 /KEYFILE 或 /DELAYSIGN 链接器选项。(有关延迟签名的信息,请参见延迟为程序集签名。)
如何:引用具有强名称的程序集
引用强名称程序集中的类型或资源的过程通常是透明的。您可以在编译时(事先绑定)或在运行时进行引用。
当您向编译器表明程序集显式引用另一程序集时,发生编译时引用。使用编译时引用时,编译器会自动获取定为目标的强名称程序集的公钥,并将其放在正在编译的程序集的程序集引用中。
1.对强名称程序集进行编译时引用
在命令提示处,键入下列命令:
<compiler command> /reference:<assembly name>
在此命令中,compiler command 是您所用语言的编译器命令,assembly name 是引用的强名称程序集的名称。您也可以使用其他编译器选项(例如 /t:library 选项)创建库程序集。
2.在运行时引用具有强名称的程序集
若要在运行时通过使用 Assembly.Load 或 Assembly.GetType 之类的方法引用强名称程序集,必须使用引用的强名称程序集的显示名称。显示名称的语法如下:
<assembly name>, <version number>, <culture>, <public key token>
您可以使用下面的强名称工具 (Sn.exe) 命令,为特定程序集输出十六进制格式的公钥和公钥标记:
sn -Tp <assembly>
如果您有公钥文件,则可改用以下命令(请注意命令行选项中大小写的区别):
sn -tp <assembly>
使用程序集和全局程序集缓存
如何:将程序集安装到全局程序集缓存
1.使用全局程序集缓存工具 (Gacutil.exe)。
gacutil –I <assembly name>
您可以使用 Gacutil.exe 将强名称程序集添加到全局程序集缓存,并查看全局程序集缓存的内容。
Gacutil.exe 只用于开发,不应用于将产品程序集安装到全局程序集缓存中。
2.使用 Microsoft Windows Installer 2.0。
这是将程序集添加到全局程序集缓存的最常用方法,建议采用。此安装程序可提供全局程序集缓存中程序集的引用计数,还具有其他优点。
3.使用 Windows 软件开发工具包 (SDK) 提供的名为程序集缓存查看器 (Shfusion.dll) 的 Windows 外壳扩展。
使用该外壳扩展可将程序集拖放到全局程序集缓存中。
4.使用 .NET Framework 配置工具 (Mscorcfg.msc)。
使用 .NET Framework 配置工具 (Mscorcfg.msc) 可以查看全局程序集缓存并将新的程序集添加到该缓存。
如何:查看全局程序集缓存的内容
1.使用全局程序集缓存工具 (Gacutil.exe) 可查看全局程序集缓存的内容。
在命令提示处,键入下列命令:
gacutil –l
2.Windows 软件开发工具包 (SDK) 还提供了名为程序集缓存查看器 (Shfusion.dll) 的 Windows 外壳扩展,可用于查看全局程序集缓存的内容。
如何:从全局程序集缓存中移除程序集
1.使用全局程序集缓存工具 (Gacutil.exe) 可从全局程序集缓存中移除程序集。
在命令提示处,键入下列命令:
gacutil –u <assembly name>
在此命令中,“程序集名称”是要从全局程序集缓存中移除的程序集的名称。
2.Windows 软件开发工具包 (SDK) 还提供了名为程序集缓存查看器 (Shfusion.dll) 的 Windows 外壳扩展,可用于从全局程序集缓存中移除程序集。
使用 Ildasm.exe 显示程序集的内容
在命令提示符处键入 ildasm <assembly name>。例如,下面的命令反汇编 Hello.exe 程序集。ildasm Hello.exe
查看程序集清单信息
在 MSIL Disassembler 窗口中双击 MANIFEST 图标。
例如,假设应用程序使用名为 Utility.dll 的程序集中的 Example 类。Utility.dll 的开发人员可能决定重构该程序集,并且在重构过程中可能将 Example 类移到另一个程序集。如果旧版本的 Utility.dll 由新版本的 Utility.dll 及其配套程序集取代,则使用 Example 类的应用程序将失败,因其无法在新版本的 Utility.dll 中找到 Example 类。
Utility.dll 的开发人员可以使用 TypeForwardedToAttribute 属性转发对 Example 类的请求,从而避免此问题。如果已向新版本的 Utility.dll 应用了该属性,则对 Example 类的请求将转发到该类目前所属的程序集。现有应用程序将继续正常执行,无需重新编译。
转发类型有四个步骤:
1.将类型的源代码从原始程序集移到目标程序集。
2.在该类型原msdn.microsoft.来所属的程序集中,为被移动的类型添加 TypeForwardedToAttribute。下面的代码显示名为 Example 的被移动类型的属性。
[assembly:TypeForwardedToAttribute(typeof(Example))]
3.编译现在包含该类型的程序集。
4.重新编译该类型原来所属的程序集,其中带有对现在包含该类型的程序集的引用。例如,如果从命令行编译一个 C# 文件,则使用 /reference(导入元数据)(C# 编译器选项)选项指定包含类型的程序集。在 C++ 中,在源文件中使用 #using 指令指定包含类型的程序集。
程序集向公共语言运行库提供了解类型实现所需要的信息。它是为共同运行和形成功能逻辑单元而生成的类型和资源的集合。
对于运行库,类型不存在于程序集上下文之外。本节描述:
如何创建模块,
如何从模块创建程序集,
如何创建密钥对并使用强名称为程序集签名,
以及如何将程序集安装至全局程序集缓存。
如何使用 MSIL 反汇编程序 (Ildasm.exe) 查看程序集清单信息。
创建程序集
您可以使用 IDE或SDK)提供的编译器和工具来创建单文件程序集或多文件程序集。最简单的程序集是具有简单名称并载入单个应用程序域的单个文件。此程序集无法由应用程序目录以外的其他程序集引用,并且不接受版本检查。要卸由载程序集组成的应用程序,只需删除应用程序所在的目录即可。对于许多开发人员而言,部署应用程序只需使用具有这些功能的程序集。您可以从几个代码模块和资源文件中创建多文件程序集。也可以创建可由多个应用程序共享的程序集。共享的程序集必须具有强名称,并且可以在全局程序集缓存中部署。
将代码模块和资源分组为程序集时会有多个选项,这取决于以下因素:
版本控制
将应具有相同版本信息的模块分组。
部署
将支持部署模型的代码模块和资源分组。
重复使用
将可在逻辑上一起使用以达到某目的模块分组。例如,程序维护时不经常使用的类型和类组成的程序集可以放在同一程序集中。此外,计划要与多个应用程序共享的类型应分组为程序集,并且程序集应使用强名称签名。
安全性
将包含要求相同安全权限的类型的模块分组。
限定范围
将包含其可见性应限于相同程序集的类型的模块分组。
程序集名称
程序集的名称存储在元数据中,它对程序集的范围及应用程序对程序集的使用有重要影响。强名称程序集有一个完全限定的名称,由程序集的名称、区域性、公钥及版本号组成。该名称通常称为显示名称,对于加载的程序集,可通过使用 FullName 属性来获得它。运行库使用这些信息来定位程序集并将其同其他同名的程序集区分开。例如,名为 myTypes 的强名称程序集可以具有下列完全限定名:
myTypes, Version=1.0.1234.0, Culture=en-US, PublicKeyToken=b77a5c561934e089c, ProcessorArchitecture=msil
在此例中,完全限定名表明 myTypes 程序集的强名称具有公钥标记、区域性值为美国英语、版本号为 1.0.1234.0。它的处理器架构为“msil”,表示程序集将以实时 (JIT) 方式编译为 32 位代码或 64 位代码,取决于操作系统和处理器。
如何:确定程序集的完全限定名
有几种方法可以在全局程序集缓存中发现程序集的完全限定名:1.使用 .NET Framework 配置工具 (Mscorcfg.msc)。
2.查看全局程序集缓存目录。
3.使用 全局程序集缓存工具 (Gacutil.exe)。
程序集的位置
程序集的位置决定公共语言运行库是否可以在引用时找到程序集,也可以决定程序集是否可与其他程序集共享。您可以在以下位置部署程序集:应用程序的目录或子目录
这是部署程序集最常用的位置。应用程序根目录的子目录可以基于语言或区域性。如果程序集具有区域属性中的信息,则它必须位于带有区域性名称的应用程序目录下的子目录中。
全局程序集缓存
这是安装于公共语言运行库安装位置的计算机内的代码缓存。大多数情况下,如果要与多个应用程序共享程序集,则应将程序集部署到全局程序集缓存中。
在 FTTP 服务器上
部署在 FTTP 服务器上的程序集必须具有强名称,请在应用程序配置文件的基本代码区域中指向此程序集。
设置程序集属性
程序集属性是提供程序集相关信息的值。属性分为以下几组信息:程序集标识属性。
信息性属性。
程序集清单属性。
强名称属性。
程序集标识属性
程序集标识属性与强名称属性(如果适用)一起决定程序集的标识:名称、版本和区域性。这些属性构成程序集的完整名称,并且在代码中引用程序集时需要这些属性。
您可以使用属性来设置程序集的版本和区域性。编译器或程序集链接器 (Al.exe) 根据包含程序集清单的文件在创建程序集时设置名称值。
AssemblyCultureAttribute 枚举的字段表明程序集支持的区域性。程序集也可以指定区域独立性,表明它包含用于默认区域性的资源。
AssemblyFlagsAttribute 设置程序集属性(例如,程序集是否可以并行运行)的值。
AssemblyVersionAttribute major.minor.build.revision 格式的数值。例如,2.4.0.0。公共语言运行库使用此值在强名称程序集中执行绑定操作。
信息性属性
使用信息性属性为程序集提供公司或产品信息。下表描述了可应用于程序集的信息性属性。
AssemblyCompanyAttribute 指定公司名称的字符串值。
AssemblyCopyrightAttribute 指定版权信息的字符串值。
AssemblyFileVersionAttribute 指定 Win32 文件版本号的字符串值。默认值通常是程序集版本。
AssemblyInformationalVersionAttribute 指定运行时不使用的版本信息的字符串值,例如,完整的产品版本号。
AssemblyProductAttribute 指定产品信息的字符串值。
AssemblyTrademarkAttribute 指定商标信息的字符串值。
程序集清单属性
您可以使用程序集清单属性在程序集清单中提供信息,包括标题、说明、默认别名和配置。下面的表格描述了程序集清单的属性。
AssemblyConfigurationAttribute 表明程序集配置的字符串值,例如 Retail 或 Debug。运行时不使用此值。
AssemblyDefaultAliasAttribute 指定引用程序集要使用的默认别名的字符串值。此值在程序集本身的名称不友好时提供友好名称,例如 GUID 值。此值也可以用作完整程序集名称的缩写。
AssemblyDescriptionAttribute 指定总结程序集的特性和作用的简短说明的字符串值。
AssemblyTitleAttribute 为程序集指定友好名称的字符串值。例如,名为 comdlg 的程序集可以有标题“Microsoft Common Dialog 控件”。
强名称属性
您可以使用强名称属性为程序集设置强名称。下面的表格描述了强名称属性。
AssemblyDelaySignAttribute 表明正在使用延迟签名的 Boolean 值。
AssemblyKeyFileAttribute 表明文件名称的字符串值,此文件中或者只包含了公钥(如果使用延迟签名),或者包含了公钥和私钥都,公钥和私钥作为参数传递至此属性的构造函数。请注意,文件名称与输出文件路径(.exe 或 .dll)相关,与源文件路径无关。
AssemblyKeyNameAttribute 表明包含密钥对(作为参数传递至此属性的构造函数)的密钥容器
创建和使用具有强名称的程序集
强名称是由程序集的标识加上公钥和数字签名组成的,其中,程序集的标识包括简单文本名称、版本号和区域性信息(如果提供的话)。它使用对应的私钥从程序集文件中生成。(程序集文件包含程序集清单,其中包含组成程序集的所有文件的名称和哈希。)强名称方案
面的方案说明了使用强名称对程序集签名及以后按照该名称引用它的过程。
1.使用以下方法之一创建强名称程序集 A:
使用支持创建强名称(如 Visual Studio 2005)的开发环境
1.开发环境或工具使用开发人员私钥对包含程序集清单的文件哈希签名。该数字签名存储在包含程序集 A 的清单的可移植可执行 (PE) 文件中。
2.程序集 B 是程序集 A 的使用者。程序集 B 的清单的引用部分包括代表程序集 A 公钥的标记。标记是完整公钥的一部分,并且这种标记(而不是密钥本身)可用于节省空间。
3.公共语言运行库在程序集放在全局程序集缓存时验证强名称签名。当运行时强名称进行绑定时,公共语言运行库会将存储在程序集 B 的清单中的密钥与用于为程序集 A 生成强名称的密钥进行比较。如果 .NET Framework 安全检查通过并且绑定成功,则程序集 B 可保证程序集 A 的位未被篡改,而这些位实际来自程序集 A 的开发人员。
如何:创建公钥/私钥对
创建密钥对
在命令提示处,键入下列命令:
sn –k <file name>
在此命令中,“文件名”是包含密钥对的输出文件的名称。
从密钥对中提取公钥
sn -p keypair.snk public.snk
如何:使用强名称对程序集签名
Windows 软件开发工具包 (SDK) 提供了多种方法来使用强名称为程序集签名:
1.使用 Windows SDK 提供的程序集链接器 (Al.exe)。
2.使用程序集属性将强名称信息插入代码中。您可以使用 AssemblyKeyFileAttribute 或 AssemblyKeyNameAttribute,这取决于要使用的密钥文件所在的位置。
说明:在 .NET Framework 2.0 版中,有些编译器会在参数已被使用时发出警告消息。
3.使用诸如 C# 和 Visual Basic 中的 /keyfile 或 /delaysign 编译器选项,或者 C++ 中的 /KEYFILE 或 /DELAYSIGN 链接器选项。(有关延迟签名的信息,请参见延迟为程序集签名。)
如何:引用具有强名称的程序集
引用强名称程序集中的类型或资源的过程通常是透明的。您可以在编译时(事先绑定)或在运行时进行引用。
当您向编译器表明程序集显式引用另一程序集时,发生编译时引用。使用编译时引用时,编译器会自动获取定为目标的强名称程序集的公钥,并将其放在正在编译的程序集的程序集引用中。
1.对强名称程序集进行编译时引用
在命令提示处,键入下列命令:
<compiler command> /reference:<assembly name>
在此命令中,compiler command 是您所用语言的编译器命令,assembly name 是引用的强名称程序集的名称。您也可以使用其他编译器选项(例如 /t:library 选项)创建库程序集。
2.在运行时引用具有强名称的程序集
若要在运行时通过使用 Assembly.Load 或 Assembly.GetType 之类的方法引用强名称程序集,必须使用引用的强名称程序集的显示名称。显示名称的语法如下:
<assembly name>, <version number>, <culture>, <public key token>
您可以使用下面的强名称工具 (Sn.exe) 命令,为特定程序集输出十六进制格式的公钥和公钥标记:
sn -Tp <assembly>
如果您有公钥文件,则可改用以下命令(请注意命令行选项中大小写的区别):
sn -tp <assembly>
使用程序集和全局程序集缓存
如何:将程序集安装到全局程序集缓存1.使用全局程序集缓存工具 (Gacutil.exe)。
gacutil –I <assembly name>
您可以使用 Gacutil.exe 将强名称程序集添加到全局程序集缓存,并查看全局程序集缓存的内容。
Gacutil.exe 只用于开发,不应用于将产品程序集安装到全局程序集缓存中。
2.使用 Microsoft Windows Installer 2.0。
这是将程序集添加到全局程序集缓存的最常用方法,建议采用。此安装程序可提供全局程序集缓存中程序集的引用计数,还具有其他优点。
3.使用 Windows 软件开发工具包 (SDK) 提供的名为程序集缓存查看器 (Shfusion.dll) 的 Windows 外壳扩展。
使用该外壳扩展可将程序集拖放到全局程序集缓存中。
4.使用 .NET Framework 配置工具 (Mscorcfg.msc)。
使用 .NET Framework 配置工具 (Mscorcfg.msc) 可以查看全局程序集缓存并将新的程序集添加到该缓存。
如何:查看全局程序集缓存的内容
1.使用全局程序集缓存工具 (Gacutil.exe) 可查看全局程序集缓存的内容。
在命令提示处,键入下列命令:
gacutil –l
2.Windows 软件开发工具包 (SDK) 还提供了名为程序集缓存查看器 (Shfusion.dll) 的 Windows 外壳扩展,可用于查看全局程序集缓存的内容。
如何:从全局程序集缓存中移除程序集
1.使用全局程序集缓存工具 (Gacutil.exe) 可从全局程序集缓存中移除程序集。
在命令提示处,键入下列命令:
gacutil –u <assembly name>
在此命令中,“程序集名称”是要从全局程序集缓存中移除的程序集的名称。
2.Windows 软件开发工具包 (SDK) 还提供了名为程序集缓存查看器 (Shfusion.dll) 的 Windows 外壳扩展,可用于从全局程序集缓存中移除程序集。
如何:查看程序集内容
您可以使用 MSIL 反汇编程序 (Ildasm.exe) 来查看文件中的 Microsoft 中间语言 (MSIL) 信息。如果所检查的文件是程序集,则此信息可包括程序集的属性以及对其他模块和程序集的引用。此信息有助于确定文件是程序集还是程序集的一部分,以及文件是否具有对其他模块或程序集的引用。使用 Ildasm.exe 显示程序集的内容
在命令提示符处键入 ildasm <assembly name>。例如,下面的命令反汇编 Hello.exe 程序集。ildasm Hello.exe
查看程序集清单信息
在 MSIL Disassembler 窗口中双击 MANIFEST 图标。
公共语言运行库中的类型转发
使用类型转发可以将类型移到另一个程序集,而不必重新编译使用原始程序集的应用程序。例如,假设应用程序使用名为 Utility.dll 的程序集中的 Example 类。Utility.dll 的开发人员可能决定重构该程序集,并且在重构过程中可能将 Example 类移到另一个程序集。如果旧版本的 Utility.dll 由新版本的 Utility.dll 及其配套程序集取代,则使用 Example 类的应用程序将失败,因其无法在新版本的 Utility.dll 中找到 Example 类。
Utility.dll 的开发人员可以使用 TypeForwardedToAttribute 属性转发对 Example 类的请求,从而避免此问题。如果已向新版本的 Utility.dll 应用了该属性,则对 Example 类的请求将转发到该类目前所属的程序集。现有应用程序将继续正常执行,无需重新编译。
转发类型有四个步骤:
1.将类型的源代码从原始程序集移到目标程序集。
2.在该类型原msdn.microsoft.来所属的程序集中,为被移动的类型添加 TypeForwardedToAttribute。下面的代码显示名为 Example 的被移动类型的属性。
[assembly:TypeForwardedToAttribute(typeof(Example))]
3.编译现在包含该类型的程序集。
4.重新编译该类型原来所属的程序集,其中带有对现在包含该类型的程序集的引用。例如,如果从命令行编译一个 C# 文件,则使用 /reference(导入元数据)(C# 编译器选项)选项指定包含类型的程序集。在 C++ 中,在源文件中使用 #using 指令指定包含类型的程序集。