System.Version 类:
使用 Version 对象可以存储和比较程序集的版本号。请注意,您或应用程序可以将 Version 对象设置为程序集的版本号。但是,Version 对象不会自动设置为任何特定程序集的版本号,Version 类的任何成员都无法获取这些信息。
版本号由二至四个部分组成:主版本号、次版本号、内部版本号和修订号。主版本号和次版本号是必选的;内部版本号和修订号是可选的,但是如果定义了修订号部分,则内部版本号就是必选的。所有定义的部分都必须是大于等于 0 的整数。版本号的格式如下所示。可选组件显示在方括号(“[”和“]”)中:
主版本.次版本[.内部版本[.修订号]]
应根据下面的约定使用这些部分:
· 主版本:名称相同但主版本号不同的程序集不可互换。例如,这适用于对产品的大量重写,这些重写使得无法实现向后兼容性。
· 次版本:如果两个程序集的名称和主版本号相同,而次版本号不同,这指示显著增强,但照顾到了向后兼容性。例如,这适用于产品的修正版或完全向后兼容的新版本。
· 内部版本:内部版本号的不同表示对相同源所作的重新编译。这适合于更改处理器、平台或编译器的情况。
· 修订号:名称、主版本号和次版本号都相同但修订号不同的程序集应是完全可互换的。这适用于修复以前发布的程序集中的安全漏洞。
程序集的只有内部版本号或修订号不同的后续版本被认为是先前版本的修补程序 (Hotfix) 更新。
当AL.exe或CSC.exe生成PE文件程序集时,还在PE文件中内嵌了一个标准的Win32版本资源。用户可以查看文件属性找到该资源。应用程序代码还可以在运行时调用System.Diagnostics.FileVersionInfo的GetVersionInfo静态方法来得到资源信息。下图显示了JeffTypes.dll属性对话框的Details选项卡。
当生成程序集时,我们应该使用自定义特性来设置其版本资源字段。这些自定义字段应该被应用在程序集级别上。下面的代码将产生如上图所示的版本信息:
using System.Reflection;
// FileDescription version information:
[assembly: AssemblyTitle("JeffTypes.dll")]
// Comments version information:
[assembly: AssemblyDescription("This assembly contains Jeff's types")]
// CompanyName version information:
[assembly: AssemblyCompany("Wintellect")]
// ProductName version information:
[assembly: AssemblyProduct("Wintellect (R) Jeff's Type Library")]
// LegalCopyright version information:
[assembly: AssemblyCopyright("Copyright (c) Wintellect 2010")]
// LegalTrademarks version information:
[assembly:AssemblyTrademark("JeffTypes is a registered trademark of Wintellect")]
// AssemblyVersion version information:
[assembly: AssemblyVersion("
// FILEVERSION/FileVersion version information:
[assembly: AssemblyFileVersion("
// PRODUCTVERSION/ProductVersion version information:
[assembly: AssemblyInformationalVersion("
// Set the Language field (discussed later in the "Culture" section)
[assembly:AssemblyCulture("")]
不幸的是,Windows Explorer属性对话框并不包含上述全部特性。特别是如果能显示AssemblyVersion特性的值就完美了,因为CLR再家在程序集的时候会使用这个值。
下面的表显示了版本资源字段和对应的自定义特性。如果你使用AL.exe生成程序集,你可以使用命令行开关来代替使用自定义特性的方式设置这些信息。表的第二列为每个版本资源字段所对应的AL.exe命令行开关。要注意的是C#编译器没有提供一些命令行开关,因此使用自定义特性来设置这些信息使首选。
版本资源 | AL.exe开关 | 自定义特性/注释 |
FILEVERSION | /fileversion | System.Reflection.AssemblyFileVersionAttribute |
PRODUCTIVERSION | /productversion | System.Reflection.AssemblyInformationalVersionAttribute |
FILEFLAGSMASK | (none) | 总是设置为VS_FFI_FILEFLAGSMARK(在WinVer.h中位0x0000003F) |
FILEFLAGS | (none) | 总是为0 |
FILEOS | (none) | 目前总是为VOS_WINDOWS32 |
FILETYPE | /target | 如果指定为/target:exe或/target:winexe则设置为VFT_APP,如果指定为/target:library,则设置为VFT_DLL |
FILESUBTYPE | (none) | 总是设置为VFT2_UNKNOWN(该字段对于VFT_APP和VFT_DLL来说没有意义) |
AssemblyVersion | /version | System.Reflection.AssemlbyVersionAttribute |
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 | (none) | 总是为空白(blank) |
ProductName | /product | System.ReflectionAssemblyProductAttribute |
ProductVersion | /productversion | System.Reflection.AssemblyInformationVersionAttribute |
SpecialBuild | (none) | 总是为空白(blank) |
当你在Visual Studio中创建C#项目时,会自动生成一个Assembly.cs文件。该文件包含所有本节所介绍的程序集版本特性,以及一些第3章涵盖的特性。你可以打开AssemblyInfo.cs文件,修改程序集特定的信息。Visual Studio还提供了一个对话框可以对程序集版本信息进行编辑。在Solution Explorer中右击项目属性条目,选择Application选项卡,点击Assembly Infomation,可以看到如下图所示的对话框。
版本号
前两个数字组成了版本的公共部分。本例中程序集的公共版本号即为2.5。第三个数字719指明了程序集的生成次数。如果每天都生成程序集,那么这个数字每天都应该增加。最后一个数字2指明了生成的版本。如果由于某些原因(如解决了一个影响其他部分的大bug)在一天内生成了两次,那么应该增加这个数字。
微软使用的就是这种版本号模式,并且也强烈建议大家这么做。未来的CLR版本将对加载新的程序集版本,以及在新版本与当前应用不兼容时回滚到旧版本提供更好的支持。要做到这种版本化支持,CLR要求修补了bug的程序集的版本要有相同的主次版本号,生成和修订版本号要指明包含了更新的服务版本。当加载程序集时,CLR将自动查找最近安装的与主次版本号匹配的程序集的服务版本。
联系客服