打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
System.Version 类

System.Version 类:

使用 Version 对象可以存储和比较程序集的版本号。请注意,您或应用程序可以将 Version 对象设置为程序集的版本号。但是,Version 对象不会自动设置为任何特定程序集的版本号,Version 类的任何成员都无法获取这些信息。

版本号由二至四个部分组成:主版本号、次版本号、内部版本号和修订号。主版本号和次版本号是必选的;内部版本号和修订号是可选的,但是如果定义了修订号部分,则内部版本号就是必选的。所有定义的部分都必须是大于等于 0 的整数。版本号的格式如下所示。可选组件显示在方括号(“[”“]”)中:

主版本.次版本[.内部版本[.修订号]]

应根据下面的约定使用这些部分:

·                             主版本:名称相同但主版本号不同的程序集不可互换。例如,这适用于对产品的大量重写,这些重写使得无法实现向后兼容性。

·                             次版本:如果两个程序集的名称和主版本号相同,而次版本号不同,这指示显著增强,但照顾到了向后兼容性。例如,这适用于产品的修正版或完全向后兼容的新版本。

·                             内部版本:内部版本号的不同表示对相同源所作的重新编译。这适合于更改处理器、平台或编译器的情况。

·                             修订号:名称、主版本号和次版本号都相同但修订号不同的程序集应是完全可互换的。这适用于修复以前发布的程序集中的安全漏洞。

程序集的只有内部版本号或修订号不同的后续版本被认为是先前版本的修补程序 (Hotfix) 更新。

.NET Framework 2.0 开始,MajorRevision MinorRevision 属性允许您在发布永久解决方案之前标识应用程序的一个临时版本,例如,纠正某个问题。此外,Windows NT 操作系统使用 MajorRevision 属性对 Service Pack 号进行编码。
 
程序集版本资源信息:

AL.exeCSC.exe生成PE文件程序集时,还在PE文件中内嵌了一个标准的Win32版本资源。用户可以查看文件属性找到该资源。应用程序代码还可以在运行时调用System.Diagnostics.FileVersionInfoGetVersionInfo静态方法来得到资源信息。下图显示了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("3.0.0.0")]

 

// FILEVERSION/FileVersion version information:

[assembly: AssemblyFileVersion("1.0.0.0")]

 

// PRODUCTVERSION/ProductVersion version information:

[assembly: AssemblyInformationalVersion("2.0.0.0")]

 

// 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_APPVFT_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,可以看到如下图所示的对话框。

 

版本号

我们看到一个程序集可以应用多个版本号。这些版本号的格式都使一致的,共包含4个部分。
 

前两个数字组成了版本的公共部分。本例中程序集的公共版本号即为2.5。第三个数字719指明了程序集的生成次数。如果每天都生成程序集,那么这个数字每天都应该增加。最后一个数字2指明了生成的版本。如果由于某些原因(如解决了一个影响其他部分的大bug)在一天内生成了两次,那么应该增加这个数字。

微软使用的就是这种版本号模式,并且也强烈建议大家这么做。未来的CLR版本将对加载新的程序集版本,以及在新版本与当前应用不兼容时回滚到旧版本提供更好的支持。要做到这种版本化支持,CLR要求修补了bug的程序集的版本要有相同的主次版本号,生成和修订版本号要指明包含了更新的服务版本。当加载程序集时,CLR将自动查找最近安装的与主次版本号匹配的程序集的服务版本。

你会发现一个程序集包含三个相关的版本号。这导致了很多混淆。每个版本号的意图和用法如下:
 
·         AssemblyFileVersion:该版本号存储在Win32版本资源中。它只是一个信息,CLR不检查该版本号。典型地,可以设置主次版本号来标识希望被公众看到的版本。然后每生成一次,就增加生成和修订版本号。理想情况下,微软工具(CSC.exeAL.exe)会自动更新生成版本号和修订版本号(根据生成的日期和时间),但事实并不是这样。该版本号可以在Windows Explorer中看到,并用来识别指定程序集的版本。
 
·         AssemblyInformationVersion:该版本号同样保存在Win32版本资源中,也是作为信息存在。CLR既不检查也不关心它。该版本号用来标识包含该程序集的产品的版本。例如,一个产品的2.0版本可能包含多个程序集,其中一个新的程序集由于没有随产品的1.0版本发布而被标识为1.0版本。典型地,我们可以设置该版本号的主次部分来表示产品的公共版本。然后在每次打包成一个完整的产品时,增加版本号的生成和修订部分。 ·         AssemblyVersion:该版本号存储在AssemblyDef清单元数据表中。在绑定强命名程序集时,CLR会使用该版本号。它用来唯一标识一个程序集。当开始开发一个程序集时,你需要设置主、次、生成、修订版本号,并且在开始开发程序集的下一个部署版本之前,不应该改变它们。在生成一个程序集时,该程序集所引用的所有程序集的版本号会内嵌到AssemblyRef表的条目中。这意味着一个程序集一个程序集将和它引用的程序集的特定版本紧紧绑定在一起。
 
 
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
java反射技术-Struts-入门讨论
C#学习笔记(二)——第一个应用程序
FrameWork4.0的兼容问题
什么是publickeytoken及publickeytoken的作用
C# 利用反射动态创建对象
C# 资源文件(一)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服