.net - AssemblyVersion, assemblyfileversion和AssemblyInformationalVersion 有什么区别??

  显示原文与译文双语对照的内容

有三个程序集版本属性。 有什么区别如果我使用AssemblyVersion并忽略其余部分,是否可以?


MSDN说:


这是跟进使用组件属性的最佳实践是什么?

时间:

引用程序集的其他程序集的位置。 如果这里数字更改,其他程序集必须更新对程序集的引用 ! 需要 AssemblyVersion 。

我使用的格式:major.minor 。 这将导致:


[assembly: AssemblyVersion("1.0")]

AssemblyFileVersion

用于部署。你可以为每个部署增加这个数字。 它被安装程序使用。 用于标记具有相同AssemblyVersion但由不同版本生成的程序集。

在 Windows 中,可以在文件属性中查看。

如果可能,由MSBuild生成它。 AssemblyFileVersion是可选的。如果没有给出,则使用 AssemblyVersion 。

我使用的格式是 major.minor.revision.build,其中我使用了开发阶段( Alpha,β,RC和 RTM ),服务包和热修复的修订。 这将导致:


[assembly: AssemblyFileVersion("1.0.3100.1242")]

AssemblyInformationalVersion

程序集的产品版本。 这是你在与客户交谈或者在你的网站上显示时使用的版本。 这里版本可以是字符串,如'1.0 发行候选'。 不幸的是,当你使用一个字符串,它将生成一个错误警告--已经报告给微软 ( 在VS2010中固定) 。 代码分析也会抱怨( CA2243 ) -- 向微软 ( 不能在VS2013中固定) 报告。 AssemblyInformationalVersion是可选的。如果没有给出,则使用 AssemblyVersion 。

我使用的格式:major.minor [revision as string] 。 这将导致:


[assembly: AssemblyInformationalVersion("1.0 RC1")]

博客是我最近写道,深入探究了组装版本控制的细节。

由于当前至少有三种方法为程序集指定版本,.NET 中的程序集的版本控制可能会令人混淆。

以下是三个主要的version-related程序集属性:


//Assembly mscorlib, Version 2.0.0.0
[assembly: AssemblyFileVersion("2.0.50727.3521")]
[assembly: AssemblyInformationalVersion("2.0.50727.3521")]
[assembly: AssemblyVersion("2.0.0.0")]

按照惯例,这四个部分的版本被称为主要版本,小版本,构建修订。

AssemblyFileVersion的目的是唯一地识别的单个装配

通常,你将手动设置主要和次要AssemblyFileVersion以反映程序集的版本,然后在每次生成系统编译程序集时递增生成和/或者修订。 AssemblyFileVersion应该允许你唯一地标识程序集的构建,以便你可以将它用作调试任何问题的起始点。

在我当前的项目中,我们让构建服务器将来自源代码管理仓库的变更列表编号编码到AssemblyFileVersion的构建和修订部分。 这允许我们直接从程序集映射到它的源代码,对于由构建服务器( 不需要在源代码管理中使用标签或者分支,或者手动保留已经发布版本的任何记录) 生成的任何程序集。

这里版本号存储在Win32版本资源中,在查看程序集的Windows Explorer 属性页时可以看到。

clr不关心也不检查 AssemblyFileVersion 。

AssemblyInformationalVersion 用于表示整个产品的版本

AssemblyInformationalVersion的目的是允许整个产品的一致版本,它可能包含许多独立版本的程序集,可能是版本策略不同,可能由不同的团队开发。

"例如产品 2.0的版本可能包含多个程序集;其中一个程序集被标记为版本 1.0,因为它是不能在同一产品的版本 1.0中装运的新程序集。 通常,你将这里版本号的主要部分和次要部分设置为表示产品的公共版本。 然后,每次打包一个完整的产品并用它的所有程序集时递增构建和修订部件。"— Jeffrey Richter,CLR通过 C# ( 第二版) ) 。 57

clr不关心也不检查 AssemblyInformationalVersion 。

AssemblyVersion 是CLR关心的惟一版本( 但它关心整个 AssemblyVersion )

CLR使用AssemblyVersion绑定到强命名的程序集。 它存储在生成程序集的AssemblyDef清单元数据表中,以及任何引用它的程序集的AssemblyRef表中。

这非常重要,因为这意味着当引用强命名的程序集时,你将严格绑定到该程序集的特定 AssemblyVersion 。 整个AssemblyVersion必须与绑定完全匹配才能成功。 例如,如果你的参考版本 1.0.0.0 build-time强烈命名大会,但只有版本 1.0.0.1 大会是在运行时可用,绑定会失败! ( 然后必须使用程序集绑定重定向 。) 来解决这里问题。

整个 AssemblyVersion 是否必须匹配。 ( 是的,确实如此。)

关于整个AssemblyVersion是否必须是完全匹配的,以便加载程序集。 有些人认为,只有AssemblyVersion的主要部分和次要部分必须匹配才能成功进行绑定。 这是一个合理的假设,但是它最终是不正确的(. NET 3.5 ),并且在你的CLR版本中验证它很简单。 只执行这里示例代码

在我的机器上,第二个程序集加载失败,并且熔合日志的最后两行使它的完全清楚:


.NET Framework Version: 2.0.50727.3521
---
Attempting to load assembly: Rhino.Mocks, Version=3.5.0.1337, Culture=neutral, PublicKeyToken=0b3305902db7183f
Successfully loaded assembly: Rhino.Mocks, Version=3.5.0.1337, Culture=neutral, PublicKeyToken=0b3305902db7183f
---
Attempting to load assembly: Rhino.Mocks, Version=3.5.0.1336, Culture=neutral, PublicKeyToken=0b3305902db7183f
Assembly binding for failed:
System.IO.FileLoadException: Could not load file or assembly 'Rhino.Mocks, Version=3.5.0.1336, Culture=neutral, 
PublicKeyToken=0b3305902db7183f' or one of its dependencies. The located assembly's manifest definition 
does not match the assembly reference. (Exception from HRESULT: 0x80131040)
File name: 'Rhino.Mocks, Version=3.5.0.1336, Culture=neutral, PublicKeyToken=0b3305902db7183f'

=== Pre-bind state information ===
LOG: User = PhoenixDani
LOG: DisplayName = Rhino.Mocks, Version=3.5.0.1336, Culture=neutral, PublicKeyToken=0b3305902db7183f
 (Fully-specified)
LOG: Appbase = [...]
LOG: Initial PrivatePath = NULL
Calling assembly : AssemblyBinding, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.
===
LOG: This bind starts in default load context.
LOG: No application configuration file found.
LOG: Using machine configuration file from C:WindowsMicrosoft.NETFramework64v2.0.50727configmachine.config.
LOG: Post-policy reference: Rhino.Mocks, Version=3.5.0.1336, Culture=neutral, PublicKeyToken=0b3305902db7183f
LOG: Attempting download of new URL [...].
WRN: Comparing the assembly name resulted in the mismatch: Revision Number
ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated.

我认为这种混乱的根源可能是因为微软最初打算对完整的AssemblyVersion完全匹配 lenient,只对主要和次要版本部分进行匹配:

"加载程序集时,CLR将自动找到与所请求的程序集的主要/次要版本相匹配的最新安装服务版本。"— Jeffrey Richter, CLR通过 C# ( 第二版) ) 。 56

这是的的行为模式测试版 1 1.0 CLR,所以这个功能只是在 1.0前移除的发泄,并且还没有设法在. NET re-surface 2.0:

"注意:我刚刚描述了你应该如何考虑版本号。 不幸的是,CLR不这样对待版本号。 [In. NET 2.0 ],CLR将版本号视为不透明的值,如果程序集依赖于另一个程序集的版本 1.2.3.4,则CLR尝试只加载版本 1.2.3.4. 然而,微软计划在未来改变clr的装载机,加载最新的建立/修订版本对于一个给定的装配的主要/次要版本。 例如在未来版本的CLR上,如果加载程序试图查找程序集的版本 1.2.3.4,而版本 1.2.5.0 则存在,则自动拾取最新的服务版本。 这将是一个非常受欢迎的变化的装载机clr—我不能等待。"— Jeffrey Richter,CLR通过 C# ( 第二版) ) p。 164 ( 强调我的)

由于还没有实现这个更改,我认为微软在这里意图上具有back-tracked是安全的,现在可能为时已晚。 我试图搜索网络,找出这些计划发生了什么,但是我找不到任何答案。 我仍然想到达它的底部。

所以我给 Jeff Richter发电子邮件,直接问他,如果有人知道发生了什么,那就是他。

他在 12小时内回复,在星期六上午,并明确了. NET 1.0 Beta 1加载程序实现了程序集的最新可用构建和修订,但在. NET 1.0之前恢复了这个行为。 后来打算重新激活它,但在 CLR 2.0交付之前它并没有成功。 然后是 Silverlight,它优先于CLR团队,因此这个功能得到了进一步的延迟。 同时,大部分的人在天的clr 1.0 β 1已经搬了,所以不太可能会看到天日,尽管已经投入的努力。

现在的行为似乎在这里。

同样值得注意的是来自我的讨论与杰夫AssemblyFileVersion只是添加删除后'自动 roll-forward'机制—因为 1.0 β 1,任何改变assemblyversion是破坏改变为你的客户,数量就无处可安全地存储你的构建。 AssemblyFileVersion是安全的,因为它从不被CLR自动检查。 也许这样更清楚,有两个独立的版本号,不同的含义,而不是试图在主要/次要( 正在中断) 和AssemblyVersion的版本/修订( non-breaking ) 部件之间分离。

底线:仔细考虑什么时候更改 AssemblyVersion

道义是,如果你正在交付其他开发人员将要引用的程序集,那么你需要非常小心地更改这些程序集的AssemblyVersion 。 对assemblyversion的任何更改将意味着应用程序开发人员将对新版本要么 re-compile ( 更新那些AssemblyRef条目) 或使用组装绑定重定向到手动覆盖绑定。

  • 对于打算向后兼容的服务发布,请不要更改
  • 为你知道有重大更改的发布更改AssemblyVersion的。

只需查看一下mscorlib上的版本属性:


//Assembly mscorlib, Version 2.0.0.0
[assembly: AssemblyFileVersion("2.0.50727.3521")]
[assembly: AssemblyInformationalVersion("2.0.50727.3521")]
[assembly: AssemblyVersion("2.0.0.0")]

请注意,这是 AssemblyFileVersion ( 它是这个版本的修订版部分,告诉你你在哪个服务包) 包含所有有趣的服务信息,与此同时,assemblyversion 2.0.0.0 固定在一个无聊的古老。 任何改变assemblyversion将迫使每个. NET 应用程序引用 mscorlib.dll re-compile反对新版本!

AssemblyVersion 几乎保持在. NET 内部,而 AssemblyFileVersion 是 Windows 所看到的。 如果你转到位于目录中的程序集的属性,以及 switch 到版本选项卡的属性,那么你将看到。 如果按版本排序文件,这就是浏览器所使用的。

AssemblyInformationalVersion 映射到"产品版本",它是纯粹的"human-used"。

AssemblyVersion 当然是最重要的,但我不会跳过 AssemblyFileVersion,要么。 如果你不提供 AssemblyInformationalVersion,编译器会通过删除版本号的"修订版"部分并离开 major.minor. 构建来添加它。

AssemblyInformationalVersionAssemblyFileVersion 显示当你查看"版本"信息文件通过 Windows Explorer 查看文件属性。 这些属性实际上被编译到由编译器创建的VERSION_INFO 资源。

AssemblyInformationVersion 是"产品版本"值。 AssemblyFileVersion 是"文件版本"值。

AssemblyVersion 是特定于. NET 程序集的,由. NET 程序集加载程序用来知道在运行时加载/绑定程序集的版本。

其中,.NET 绝对需要的唯一一个是 AssemblyVersion 属性。 不幸的是,在不区分大小写的情况下,它也会引起大多数问题,特别是当你对程序集进行强命名时。

值得注意的是其他一些东西:

1 ) 在生成的程序集文件的Windows Explorer 属性对话框中,有两个称为"文件版本"的地方。 对话框标题中显示的是 AssemblyVersion,而不是 AssemblyFileVersion 。

另一个版本信息部分,有另一个名为"文件版本"的元素。 你可以在这里看到作为AssemblyFileVersion输入的内容。

2 ) AssemblyFileVersion只是纯文本。 它不需要符合AssemblyVersion所做的编号方案限制。 可以是 3.2.<发行标记文本> 。 <datetime>,如果你喜欢的话。 你的构建系统将必须填入令牌。

此外,它不服从AssemblyVersion所提供的通配符替换。 如果你只有一个值的" 3.0.1.*" AssemblyInfo.cs, 这正是将显示在其他版本 information-> 文件版本元素。

3 )我不知道影响一个安装程序使用其他数字文件的版本号,。

更改程序集AssemblyVersion时,如果有强名称,则需要重新编译引用程序集,否则程序集不加载 ! 如果它没有强大的名称,如果没有显式地添加到项目文件,它不会被复制到输出目录构建不同所以你可能错过程序集时,特别是在打扫输出目录。

...