有三个程序集版本属性。什么是差异?是否可以使用AssemblyVersion而忽略其余部分?


MSDN说:

AssemblyVersion: 指定指定属性的程序集的版本。 AssemblyFileVersion: 指示编译器为Win32文件版本资源使用特定的版本号。Win32文件版本不需要与程序集的版本号相同。 AssemblyInformationalVersion: 定义程序集清单的其他版本信息。


本文是“使用程序集属性的最佳实践是什么?”


当前回答

AssemblyVersion

引用您程序集的其他程序集将查找的位置。如果此编号更改,其他程序集必须更新它们对您的程序集的引用!只有当这个版本破坏向后兼容性时才更新它。需要AssemblyVersion。

我使用的格式是:major。Minor(对于非常稳定的代码库,major)。这将导致:

[assembly: AssemblyVersion("1.3")]

如果您严格遵循SemVer,那么这意味着您只在主要更改时进行更新,即1.0、2.0、3.0等。

AssemblyFileVersion

用于部署(如安装程序)。您可以为每次部署增加这个数字。使用它来标记具有相同的AssemblyVersion但由不同的构建和/或代码生成的程序集。

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

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

我使用的格式是:major.minor.patch。在这里,我使用SemVer完成前三个部分,使用构建服务器的buildnumber完成最后一个部分(本地构建为0)。 这将导致:

[assembly: AssemblyFileVersion("1.3.2.42")]

注意系统。Version将这些部分命名为major.minor.build.revision!

AssemblyInformationalVersion

程序集的“产品”版本。这是你在与客户交谈或在你的网站上展示时使用的版本。这个版本可以是一个字符串,比如'1.0 Release Candidate'。

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

我使用的格式是:major.minor[。补丁][修订为字符串]。这将导致:

[assembly: AssemblyInformationalVersion("1.3 RC1")]

其他回答

AssemblyVersion基本上是。net内部的,而AssemblyFileVersion是Windows所看到的。如果您转到位于目录中的程序集的属性并切换到版本选项卡,您将在顶部看到AssemblyFileVersion。如果您按版本对文件进行排序,这就是Explorer所使用的。

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

AssemblyVersion当然是最重要的,但我也不会跳过AssemblyFileVersion。如果您没有提供AssemblyInformationalVersion,编译器将为您添加它,方法是去掉版本号的“revision”部分,并保留major.minor.build。

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

AssemblyVersion

引用您程序集的其他程序集将查找的位置。如果此编号更改,其他程序集必须更新它们对您的程序集的引用!只有当这个版本破坏向后兼容性时才更新它。需要AssemblyVersion。

我使用的格式是:major。Minor(对于非常稳定的代码库,major)。这将导致:

[assembly: AssemblyVersion("1.3")]

如果您严格遵循SemVer,那么这意味着您只在主要更改时进行更新,即1.0、2.0、3.0等。

AssemblyFileVersion

用于部署(如安装程序)。您可以为每次部署增加这个数字。使用它来标记具有相同的AssemblyVersion但由不同的构建和/或代码生成的程序集。

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

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

我使用的格式是:major.minor.patch。在这里,我使用SemVer完成前三个部分,使用构建服务器的buildnumber完成最后一个部分(本地构建为0)。 这将导致:

[assembly: AssemblyFileVersion("1.3.2.42")]

注意系统。Version将这些部分命名为major.minor.build.revision!

AssemblyInformationalVersion

程序集的“产品”版本。这是你在与客户交谈或在你的网站上展示时使用的版本。这个版本可以是一个字符串,比如'1.0 Release Candidate'。

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

我使用的格式是:major.minor[。补丁][修订为字符串]。这将导致:

[assembly: AssemblyInformationalVersion("1.3 RC1")]

当您通过Windows资源管理器通过查看文件属性查看文件的“版本”信息时,会显示AssemblyInformationalVersion和AssemblyFileVersion。这些属性实际上被编译到编译器创建的VERSION_INFO资源中。

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

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

在这些属性中,. net唯一绝对需要的是AssemblyVersion属性。不幸的是,当它不加区别地更改时,也会导致大多数问题,特别是如果您对程序集进行了强命名的话。

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

例如,1.0.3的AssemblyVersion。*与asp.net核心dotnet-cli打包

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

生成一个版本为1.0.3-ci-7的包,您可以使用以下方法进行反射检查:

CustomAttributeExtensions.GetCustomAttribute<AssemblyInformationalVersionAttribute>(asm);