AL.exe或CSC.exe生成一个PE文件程序集时,还会在PE文件中嵌入一个标准的Win32版本资源。用户可以查看文件的属性来检查这个资源。在应用程序代码中,可以调用System.Diagnostics.FileVersionInfo的static方法GetVersionInfo来获取并检查这些信息。图2-4显示的是JeffType.dll属性对话框的“详细信息”选项卡。
图2-4 “JeffTypes.dll属性”对话框的“详细信息”选项卡
生成程序集时,应该使用一些定制attribute来设置版本资源文件,这些attribute是在源代码中应用于assembly这一级别的。图2-4的版本信息是用以下代码来生成的:
using System.Reflection;
// FileDescription版本信息
[assembly:AssemblyTitle("JeffTypes.dll")]
// Comments版本信息
[assembly:AssemblyDescription("This assembly contains Jeff's types")]
// CompandName版本信息
[assembly:AssemblyCompany("Wintellect")]
// ProdutctName版本信息
[assembly:AssemblyProduct("Wintellect (R) Jeff's Type Library")]
// LegalCopyright版本信息
[assembly:AssemblyCopyright("Copyright (c) Wintellect 2010")]
// LegalTrademarks版本信息
[assembly:AssemblyTrademark("JeffTypes is a registered trademark of Wintellect")]
// AssemblyVersion版本信息
[assembly:AssemblyVersion("3.0.0.0")]
// FILEVERSION/FileVersion版本信息
[assembly:AssemblyFileVersion("1.0.0.0")]
// PRODUCTVERSION/ProductVersion版本信息
[assembly:AssemblyInformationalVersion("2.0.0.0")]
// 设置Language字段(参见2.6节“语言文化”)
[assembly:AssemblyCulture("")]
重要提示:Windows资源管理器的属性对话框明显遗漏了一些attribute值。最遗憾的是没有显示AssemblyVersion这个attribute值,因为CLR加载程序集时会使用这个值,详情将在第3章讨论。
表2-4总结了版本资源字段以及它们对应的定制attribute。如果使用AL.exe来生成程序集,可以用命令行开关来设置这些信息,而不必使用定制attribute。表2-4的第二列显示了每个版本资源字段对应的AL.exe命令行开关。注意,C#编译器没有提供这些命令行开关。在这种情况下,最好是用定制attribute来设置这些信息。
表2-4 版本资源字段和对应的AL.exe开关/定制attribute
版本资源 | AL.exe开关 | 定制attribute/说明 |
FILEVERSION | /fileversion | System.Reflection.AssemblyFileVersionAttribute |
PRODUCTVERSION | /productversion | System.Reflection.AssemblyInformationalVersionAttribute |
FILEFLAGSMASK | (无) | 总是设为VS_FFI_FILEFLAGSMASK(在WinVer.h中定义为0x0000003F) |
FILEFLAGS | (无) | 总是0 |
FILEOS | (无) | 目前总是VOS__WINDOWS32 |
FILETYPE | /target | 如果指定了/target:exe或/target:winexe,就设为VFT_APP;如果指定了/target:library,就设为VFT_DLL |
FILESUBTYPE | (无) | 总是设为VFT2_UNKNOWN(该字段对于VFT_APP和VFT_DLL无意义) |
AssemblyVersion | /version | System.Reflection.AssemblyVersionAttribute |
Comments | /description | System.Reflection.AssemblyDescriptionAttribute |
CompanyName | /company | System.Reflection.AssemblyCompanyAttribute |
FileDescription | /title | System.Reflection.AssemblyTitleAttribute |
FileVersion | /version | System.Reflection.AssemblyFileVersionAttribute |
InternalName | /out | 设为指定的输出文件的名称(无扩展名) |
LegalCopyright | /copyright | System.Reflection.AssemblyCopyrightAttribute |
LegalTrademarks | /trademark | System.Reflection.AssemblyTrademarkAttribute |
OriginalFilename | /out | 设为输出文件的名称(无路径) |
PrivateBuild | (无) | 总是为空 |
ProductName | /product | System.Reflection.AssemblyProductAttribute |
ProductVersion | /productversion | System.Reflection.AssemblyInformationalVersionAttribute |
SpecialBuild | (无) | 总是空白 |
重要提示:在Visual Studio中新建一个C#项目时,会自动创建一个AssemblyInfo.cs文件。这个文件除了包含本节描述的所有程序集版本attribute之外,还包括要在第3章讨论的几个attribute。可直接打开AssemblyInfo.cs文件,并修改你的程序集特有的信息。Visual Studio还提供了一个对话框来帮助你编辑这个文件中的程序集信息。为了打开这个对话框,请打开项目的属性对话框,然后在“应用程序”选项卡中单击“程序集信息”。随后会看到如图2-5所示的一个对话框。
图2-5 Visual Studio的“程序集信息”对话框