AssemblyVersion,AssemblyFileVersion和AssemblyInformationalVersion之间有什么区别?

时间:2008-09-15 16:47:38

标签: .net assemblies attributes

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


MSDN说:


这是对What are the best practices for using Assembly Attributes?

的跟进

7 个答案:

答案 0 :(得分:867)

<强>的AssemblyVersion

引用装配的其他装配将显示的位置。如果此数字更改,其他程序集必须更新其对程序集的引用! AssemblyVersion是必需的。

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

[assembly: AssemblyVersion("1.0")]

<强>的AssemblyFileVersion

用于部署。您可以为每个部署增加此数量。它由安装程序使用。使用它来标记具有相同AssemblyVersion但是从不同构建生成的程序集。

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

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

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

[assembly: AssemblyFileVersion("1.0.3100.1242")]

<强> AssemblyInformationalVersion

装配的产品版本。这是您与客户交谈或在您的网站上显示时使用的版本。此版本可以是字符串,例如“ 1.0 Release Candidate ”。

代码分析会抱怨它(CA2243) - reported to Microsoft(VS2013中没有修复)。

AssemblyInformationalVersion是可选的。如果没有给出,则使用AssemblyFileVersion。

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

[assembly: AssemblyInformationalVersion("1.0 RC1")]

答案 1 :(得分:568)

答案 2 :(得分:41)

AssemblyVersion几乎保留在.NET内部,而AssemblyFileVersion是Windows所见。如果您转到位于目录中的程序集的属性并切换到版本选项卡,AssemblyFileVersion就是您最常见到的内容。如果按版本对文件进行排序,则这就是资源管理器使用的内容。

AssemblyInformationalVersion映射到“产品版本”,并且纯粹是“人类使用”。

AssemblyVersion肯定是最重要的,但我也不会跳过AssemblyFileVersion。如果您不提供AssemblyInformationalVersion,编译器会通过剥离版本号的“修订版”部分并保留major.minor.build来为您添加。

答案 3 :(得分:21)

通过查看文件属性,通过Windows资源管理器查看文件的“版本”信息时,将显示

AssemblyInformationalVersionAssemblyFileVersion。这些属性实际上被编译到由编译器创建的VERSION_INFO资源中。

AssemblyInformationalVersion是“产品版本”值。 AssemblyFileVersion是“文件版本”值。

AssemblyVersion特定于.NET程序集,.NET程序集加载程序使用它来了解在运行时加载/绑定的程序集版本。

其中,.NET唯一需要的是AssemblyVersion属性。不幸的是,当它不加选择地改变时,它也会导致大多数问题,特别是如果你强烈命名你的程序集。

答案 4 :(得分:7)

值得注意的是其他一些事情:

1)如生成的程序集文件的Windows资源管理器属性对话框所示,有两个名为“文件版本”的地方。在对话框的标题中看到的那个显示AssemblyVersion,而不是AssemblyFileVersion。

在“其他版本信息”部分中,还有另一个名为“文件版本”的元素。您可以在此处查看作为AssemblyFileVersion输入的内容。

2)AssemblyFileVersion只是纯文本。它不必符合AssemblyVersion所做的编号方案限制(&lt; build&gt;&lt; 65K,例如)。它可以是3.2。&lt; release tag text&gt;。&lt; datetime&gt;,如果你愿意的话。您的构建系统必须填写令牌。

此外,它不受AssemblyVersion的通配符替换。如果您在AssemblyInfo.cs中只有一个值“3.0.1。*”,那么这正是将在其他版本信息 - &gt;文件版本元素中显示的内容。

3)不过,我不知道安装程序对使用数字文件版本号以外的东西的影响。

答案 5 :(得分:7)

为了使这个问题保持最新状态,值得强调的是,NuGet使用AssemblyInformationalVersion并反映包版本,包括任何预发布后缀。

例如,使用asp.net core dotnet-cli打包的1.0.3。*的AssemblyVersion

dotnet pack --version-suffix ci-7 src/MyProject

使用版本1.0.3-ci-7生成一个包,您可以使用反射检查:

CustomAttributeExtensions.GetCustomAttribute<AssemblyInformationalVersionAttribute>(asm);

答案 6 :(得分:2)

当程序集的AssemblyVersion发生变化时, 如果它具有强名称,则需要重新编译引用程序集,否则程序集不会加载! 如果它没有强名称,如果没有显式添加到项目文件中,则在构建时不会将其复制到输出目录,因此您可能会错过依赖于程序集,特别是在清理输出目录之后。