assemblyversion 自动和AssemblyFileVersion的区别

System.Version 类
System.Version 类
System.Version 类:
使用 Version 对象可以存储和比较程序集的版本号。请注意,您或应用程序可以将 Version 对象设置为程序集的版本号。但是,Version 对象不会自动设置为任何特定程序集的版本号,Version 类的任何成员都无法获取这些信息。
版本号由二至四个部分组成:主版本号、次版本号、内部版本号和修订号。主版本号和次版本号是必选的;内部版本号和修订号是可选的,但是如果定义了修订号部分,则内部版本号就是必选的。所有定义的部分都必须是大于等于 0 的整数。版本号的格式如下所示。可选组件显示在方括号(“[”和“]”)中:
主版本.次版本[.内部版本[.修订号]]
应根据下面的约定使用这些部分:
·主版本:名称相同但主版本号不同的程序集不可互换。例如,这适用于对产品的大量重写,这些重写使得无法实现向后兼容性。
·次版本:如果两个程序集的名称和主版本号相同,而次版本号不同,这指示显著增强,但照顾到了向后兼容性。例如,这适用于产品的修正版或完全向后兼容的新版本。
·内部版本:内部版本号的不同表示对相同源所作的重新编译。这适合于更改处理器、平台或编译器的情况。
·修订号:名称、主版本号和次版本号都相同但修订号不同的程序集应是完全可互换的。这适用于修复以前发布的程序集中的安全漏洞。
程序集的只有内部版本号或修订号不同的后续版本被认为是先前版本的修补程序 (Hotfix) 更新。
从 .NET Framework 2.0 开始, 和
属性允许您在发布永久解决方案之前标识应用程序的一个临时版本,例如,纠正某个问题。此外,Windows&NT 操作系统使用
属性对 Service Pack 号进行编码。
程序集版本资源信息:
当AL.exe或CSC.exe生成PE文件程序集时,还在PE文件中内嵌了一个标准的Win32版本资源。用户可以查看文件属性找到该资源。应用程序代码还可以在运行时调用System.Diagnostics.FileVersionInfo的GetVersionInfo静态方法来得到资源信息。下图显示了JeffTypes.dll属性对话框的Details选项卡。
当生成程序集时,我们应该使用自定义特性来设置其版本资源字段。这些自定义字段应该被应用在程序集级别上。下面的代码将产生如上图所示的版本信息:
using System.R
// 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
总是设置为VS_FFI_FILEFLAGSMARK(在WinVer.h中位0x0000003F)
目前总是为VOS_WINDOWS32
如果指定为/target:exe或/target:winexe则设置为VFT_APP,如果指定为/target:library,则设置为VFT_DLL
FILESUBTYPE
总是设置为VFT2_UNKNOWN(该字段对于VFT_APP和VFT_DLL来说没有意义)
AssemblyVersion
System.Reflection.AssemlbyVersionAttribute
/description
System.Reflection.AssemblyDescriptionAttribute
CompanyName
System.Reflection.AssemblyCompanyAttribute
FileDescription
System.Reflection.AssemblyTitleAttribute
FileVersion
System.Reflection.AssemblyFileVersionAttribute
InternalName
设置为指定的输出文件的名称(不含扩展名)
LegalCopyright
/copyright
System.Reflection.AssemblyCopyrightAttribute
LegalTrademarks
/trademark
System.Reflection.AssemblyTrademarkAttribute
OriginalFilename
设置为输出文件的名称(不含路径)
PrivateBuild
总是为空白(blank)
ProductName
System.ReflectionAssemblyProductAttribute
ProductVersion
/productversion
System.Reflection.AssemblyInformationVersionAttribute
SpecialBuild
总是为空白(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.exe或AL.exe)会自动更新生成版本号和修订版本号(根据生成的日期和时间),但事实并不是这样。该版本号可以在Windows Explorer中看到,并用来识别指定程序集的版本。
·AssemblyInformationVersion:该版本号同样保存在Win32版本资源中,也是作为信息存在。CLR既不检查也不关心它。该版本号用来标识包含该程序集的产品的版本。例如,一个产品的2.0版本可能包含多个程序集,其中一个新的程序集由于没有随产品的1.0版本发布而被标识为1.0版本。典型地,我们可以设置该版本号的主次部分来表示产品的公共版本。然后在每次打包成一个完整的产品时,增加版本号的生成和修订部分。 ·AssemblyVersion:该版本号存储在AssemblyDef清单元数据表中。在绑定强命名程序集时,CLR会使用该版本号。它用来唯一标识一个程序集。当开始开发一个程序集时,你需要设置主、次、生成、修订版本号,并且在开始开发程序集的下一个部署版本之前,不应该改变它们。在生成一个程序集时,该程序集所引用的所有程序集的版本号会内嵌到AssemblyRef表的条目中。这意味着一个程序集一个程序集将和它引用的程序集的特定版本紧紧绑定在一起。
发表评论:
TA的最新馆藏[转]&Incrementing the Assembly Version for Each Build – Random Musings of Jeremy Jameson
Archives &(2).Net中DLL冲突解决(真假美猴王) - 推酷
.Net中DLL冲突解决(真假美猴王)
《西游记》中真假美猴王让人着实难以区分,但是我们熟知了其中的细节也不难把他们剥去表象分别出来。对问题不太关心的可以直接调到文中关于.Net文件版本的介绍
最近在编译AKKA.net 时出现了一个问题: Newtonsoft.Json.dll 冲突.
C:\Program Files (x86)\MSBuild\14.0\mon.CurrentVersion.targets(1819,5): warning MSB3243: No way to resolve conflict between &
Newtonsoft.Json, Version=7.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed
Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed
&. Choosing &Newtonsoft.Json, Version=7.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed& arbitrarily.
Consider app.config remapping of assembly &Newtonsoft.Json, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed& from Version &4.5.0.0& [
C:\Program Files (x86)\Microsoft Visual Studio 12.0\Blend\Newtonsoft.Json.dll
] to Version &7.0.0.0& [
D:\TestProjects\GitHub\akka.net\src\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll
] to solve conflict and get rid of warning.
在VisualStudio给出的错误提示中,第一句话着实让人摸不着头脑。还好第二句给出冲突Dll文件的具体路径。但是奇怪的的是明明通过以下命令:
Newtonsoft.Json.dll
应该是 “7.0.1”版本,怎么出来让remaping 到 “7.0.0”版本。
奇怪啊!!
核实Nuget到 Newtonsoft.Json.dll
打开Dll文件核实下:
双击“1 [Neutral]”图标,将会打开dll程序集的详细信息如下:
原来Assembly的确是“7.0.0.0”
那好吧,我们再来看下Blend 下的同名文件
Blend文件夹下的 Newtonsoft.Json.dll
Assembly Version 4.5.0.0 这和上面7.0.0.0完全不一样啊,VisualStudio(VS)怎么会把他们混淆了??
让我们来猜下原因吧,那是不是VS找不到具体的7.0.0 的Dll呢,然后就找到了4.5.0 的DLL,结果就…??
打开报错的项目,先卸载项目,然后才可以编辑查看项目文件:
发现有两个地方出现了 Newtonsoft.Json :
在查阅过&choose&这个不常用节点的用法后,我猜这个是因为这个节点导致,于是 直接Ctrl+H 替换成于Reference相同的路径,编译,成功通过 !
问题相关知识
上一堆截图,到底要干嘛呢?相信一定有人会疑惑。
对,上面折腾半天的目的就是为了找出以下几个关于.Net程序集版本至关重要的三大版本,第一次接触一定很好奇(也许是郁闷,因为出问题闹心啊)。
三个重要的.Net 程序集版本
在.Net中有三个重要的版本信息,因为经常混淆,所以要大家注意:
// Assembly mscorlib, Version 2.0.0.0
[assembly: AssemblyFileVersion(&2.0.&)]
[assembly: AssemblyInformationalVersion(&2.0.&)]
[assembly: AssemblyVersion(&2.0.0.0&)]
版本信息的四部分,我们约定为
Major Version(主版本)
Minor Version(次版本)
Build(编译版本)
Revision(修订版本)
AssemblyFileVersion
通常我们会手动设置 AssemblyFileVersion 中的Major和Minor 去体现程序集的版本,Build 和(或者) Revision 这两个一般是由Build工具在每次编译程序集时自动增加的。 我们可以用 AssemblyFileVersion 来作为程序集的唯一标识。(调试的时候我们就可以根据这个版本号找到相应dll,)
在项目开发中一般我们会用ChangeList(变更集)号去生成 AssemblyFileVersion 的Build和Revision两部分。这样就很方便从dll找到相应的源代码变更集。省去了自己单独去记录发布的dll和源代码对应关系的繁琐事项。
AssemblyFileVersion存储在Win32的版本资源中,所以可以通过资源浏览器(右击属性)查看程序集的相应 AssemblyFileVersion 。
The CLR does not care about nor examine the AssemblyFileVersion .
AssemblyInformationalVersion
AssemblyInformationalVersion 目的是用于整个产品(某个dll或者exe)能够有一个一致的(coherent)版本。这个产品可能含有很多个程序集,而且这些程序集可能有不同的版本标识策略或者根本不是同一个团队开发的。
“For example, version 2.0 of a product might contai one of these assemblies is marked as version 1.0 since it’s a new assembly that didn’t ship in version 1.0 of the same product. Typically, you set the major and minor parts of this version number to represent the public version of your product. Then you increment the build and revision parts each time you package a complete product with all its assemblies.”
— Jeffrey Richter,
The CLR does not care about nor examine the AssemblyInformationalVersion .
AssemblyVersion
AssemblyVersion存储在AssemblyDef的元数据列表清单,任何引用该 AssemblyVersion 版本的dll(.exe)。
The AssemblyVersion is used by the CLR to bind to strongly named assemblies.(CLR唯一关心的版本)
这一点至关重要。
只有AssemblyVersion版本完全一致的(匹配的) 强命名 程序集,才能编译成功。例如,如果你引用了一个1.0.0.0的强命名A.dll,编译后,你将A.DLL升级到了1.0.0.1.那么,不好意思,你的程序将会失败,那就没有办法了吗?有可以参考
来做DLL重定向。
小心修改AssemblyVersion
当别的开发人员正在引用你发布的程序集是,你应该非常小心的去修改这些程序集的 AssemblyVersion 。 AssemblyVersion的任何改动都意味着开发者不得不重新编译应用程序(或者相应的dll)而不是简单的直接文件覆盖(新版本dll直接覆盖就版本dll)。
如果要保证当前发布的dll向后兼容,请 不
要修改 AssemblyVersion。
如果你有突破性的修改(脱胎换骨的大改动),那请 修 改
AssemblyVersion 。
有的同仁总觉得.Net简单,GC帮我做了好多内存管理工作,我们就可以随心所欲,为所欲为。且不知任何技术都有他不可告人的软肋,广告总是大篇幅的说着自己的完美哪有功夫给大家展示自己的不足(当然这里很多时候涉及到了设计准则哲学,如框架设计会优先考虑20%的经常使用功能,而暂缓考虑其他的80%不常用的功能)。
所以学习一门技术一定要知道他的底层原理和关键点。知道的越多,你被坑的概率就会越少,效率就越高。
《CLR Via C#》
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
AssemblyFileVersion:为编译器生成的文件加入版本号,只是一个文件号标识,没有具体的作用,也就是在资源管理器里查看属性时看到的版本;AssemblyInformationalVersion:在引用程序集时,这个属性不用于版本检查,它仅用于版本信息。该属性非常适合于指定使用多个程序集的应用程序的版本。打开可执行程序的属性,这个值就显示为Product Version&Guid:这个实际上是COM里提出的概念,只是一个唯一的ID,.NET为了维护和COM的交互性,所以还存在这个概念。[assembly: AssemblyVersion("1.0.0.1")][assembly: AssemblyFileVersion("1.0.0.2")]将第二句注释掉,并将前一句1.0.0.1改为1.0.*后,其后两位版本号会自动递增,然而就概念而言这样做不一定合适。
阅读(639)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_',
blogTitle:'AssemblyVersion和AssemblyFileVersion的区别',
blogAbstract:'[本文已迁移至
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}}

我要回帖

更多关于 c assembly version 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信