如何最好地使用文件版本和程序集版本?

时间:2020-03-05 18:40:25  来源:igfitidea点击:

在.NET中,构建项目时有两个可用的版本号:"文件版本"和"程序集版本"。我们如何使用这些数字?保持相同?自动增加一个,但手动更改另一个?

还有" AssemblyInformationalVersion"属性呢?

我发现此支持Microsoft知识库(KB)文章提供了一些帮助:如何使用程序集版本和程序集文件版本。

解决方案

回答

我保持不变。但是然后,我没有多文件程序集,那时AssemblyVersion编号变得很重要。我将Microsoft样式的日期编码用于内部版本号,而不是自动递增(我发现构建某件东西的次数没有那么重要)。

回答

在有多个文件程序集的情况下(即1个exe和5个dll),我将为每个文件使用不同的文件版本,但对所有文件都使用相同的程序集版本,从而使我们知道每个dll都使用哪个exe。

回答

@Adam:我们是否在每次构建时都更改文件版本?我们是否正在使用版本控制(SYN或者VSS),并使用该信息将源链接回二进制文件?

程序集版本保持不变似乎很有意义。即" 2.0.0.0"。这对应于产品的部署。

文件版本更改为与源控件中的修订版本匹配。 " 2.0.??.revision"这将提供从特定dll(或者exe)到生成它的源的链接。

回答

在具有多个项目的解决方案中,我发现非常有用的一件事是使所有AssemblyInfo文件都指向一个控制版本控制的项目。所以我的AssemblyInfos有一行:

[assembly: AssemblyVersion(Foo.StaticVersion.Bar)]

我有一个带有单个文件的项目,该文件声明了字符串:

namespace Foo
{
    public static class StaticVersion
    {
         public const string Bar= "3.0.216.0"; // 08/01/2008 17:28:35
    }
}

然后,我的自动构建过程只需通过从数据库中提取最新版本并增加倒数第二个数字来更改该字符串。

我仅在功能集发生巨大变化时才更改主要版本号。

我完全不更改文件版本。

回答

KB文章提到了最重要的区别:文件版本仅用于显示目的,而程序集版本在.NET加载行为中起着重要的作用。

如果更改了程序集版本号,则整个程序集的标识已更改。开发人员将需要重建以引用新版本(除非我们放置了一些自动版本化的"策略"),并且在运行时仅会加载具有匹配版本号的程序集。

这在我的环境中很重要,在该环境中,出于审计目的,我们需要一个递增的,高度可见的版本号,但我们不想强迫开发人员重建或者在生产中同时存在多个版本。在这种情况下,对于向后兼容的较小更改,我们将更新文件版本,而不是程序集版本。

回答

File versions are only used for display purposes, whereas the assembly version plays an important part in the .NET loading behaviour.

不完全的。当我们将现有版本升级到以前的版本时,文件版本对于Windows Installer也很重要。

回答

在我当前的应用程序中,每个VS项目都有一个指向" AssemblyBuildInfo"源文件的链接,该文件具有以下属性:

[assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyCompany("Acme Corporationy")]
[assembly: AssemblyCopyright("Copyright ?  2009 Acme Corporation")]

这样,解决方案中的所有程序集都共享相同的版本和公司信息(这意味着如果必须更改,则只能更改一次)。通过排除FileVersion,它将自动设置为AssemblyVersion。