383

我只是想知道如何使用 Visual Studio (2005)自动增加文件的构建(和版本?)。

如果我查看 say 的属性C:\Windows\notepad.exe,版本选项卡会给出“文件版本:5.1.2600.2180”。我也想在我的 dll 版本中获得这些很酷的数字,而不是 1.0.0.0 版本,让我们面对它有点沉闷。

我尝试了一些东西,但它似乎不是开箱即用的功能,或者我只是在寻找错误的地方(像往常一样)。

我主要从事网络项目....

我看了两个:

  1. http://www.codeproject.com/KB/dotnet/Auto_Increment_Version.aspx
  2. http://www.codeproject.com/KB/dotnet/build_versioning.aspx

我简直不敢相信做某事付出这么大的努力是标准做法。

编辑: 据我所知,它在 VS2005 中不起作用(http://www.codeproject.com/KB/dotnet/AutoIncrementVersion.aspx

4

25 回答 25

448

在 Visual Studio 2008 中,以下工作。

找到 AssemblyInfo.cs 文件并找到以下 2 行:

[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

您可以尝试将其更改为:

[assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyFileVersion("1.0.*")]

但这不会给你想要的结果,你最终会得到1.0.*的产品版本和1.0.0.0的文件版本。不是你想要的!

但是,如果您删除这些行中的第二行并且只拥有:

[assembly: AssemblyVersion("1.0.*")]

然后编译器会将文件版本设置为等于产品版本,您将获得所需的自动递增产品和文件版本同步的结果。例如1.0.3266.92689

于 2008-12-10T16:35:54.593 回答
157

打开 AssemblyInfo.cs 文件并更改

// You can specify all the values or you can default the Build and Revision Numbers 
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

[assembly: AssemblyVersion("1.0.*")]
//[assembly: AssemblyFileVersion("1.0.0.0")]

您可以在 IDE 中通过转到项目 -> 属性 -> 程序集信息来执行此操作

但是,这只允许您自动增加程序集版本,并为您提供

程序集文件版本:此字段中不允许使用通配符 ("*")

如果您尝试在文件版本字段中放置 *,则消息框。

所以只需打开 assemblyinfo.cs 并手动完成。

于 2008-12-10T15:54:19.450 回答
55

在每个构建中更改版本号的另一个选项是使用MSBuild.Community.Tasks的Version任务。只需下载他们的安装程序,安装它,然后修改以下代码并将其粘贴到您的文件中:<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />.csproj

<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" />
<Target Name="BeforeBuild">
    <Version VersionFile="Properties\version.txt" Major="1" Minor="0" BuildType="Automatic" StartDate="12/31/2009" RevisionType="BuildIncrement">
      <Output TaskParameter="Major" PropertyName="Major" />
      <Output TaskParameter="Minor" PropertyName="Minor" />
      <Output TaskParameter="Build" PropertyName="Build" />
      <Output TaskParameter="Revision" PropertyName="Revision" />
    </Version>
    <AssemblyInfo CodeLanguage="CS"
                  OutputFile="Properties\VersionInfo.cs"
                  AssemblyVersion="$(Major).$(Minor)"
                  AssemblyFileVersion="$(Major).$(Minor).$(Build).$(Revision)" />
</Target>

注意:根据您的语言环境调整 StartDate 属性。它目前不使用不变的文化。

对于 2010 年 1 月 14 日的第三个版本,这将创建一个VersionInfo.cs具有以下内容的:

[assembly: AssemblyVersion("1.0")]
[assembly: AssemblyFileVersion("1.0.14.2")]

然后必须将此文件添加到项目中(通过Add existing item),并且AssemblyVersion必须AssemblyFileVersionAssemblyInfo.cs.

用于更改版本组件的不同算法在版本属性$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.chm中进行了描述。

于 2010-01-15T09:21:09.373 回答
30

我想出了一个类似于 Christians 但不依赖于社区 MSBuild 任务的解决方案,这对我来说不是一个选项,因为我不想为我们所有的开发人员安装这些任务。

我正在生成代码并编译为程序集,并希望自动增加版本号。但是,我不能使用 VS 6.0.* AssemblyVersion 技巧,因为它每天都会自动增加内部版本号并破坏与使用旧版本号的程序集的兼容性。相反,我想要一个硬编码的 AssemblyVersion 但自动递增的 AssemblyFileVersion。我通过在 AssemblyInfo.cs 中指定 AssemblyVersion 并像这样在 MSBuild 中生成 VersionInfo.cs 来完成此操作,

  <PropertyGroup>
    <Year>$([System.DateTime]::Now.ToString("yy"))</Year>
    <Month>$([System.DateTime]::Now.ToString("MM"))</Month>
    <Date>$([System.DateTime]::Now.ToString("dd"))</Date>
    <Time>$([System.DateTime]::Now.ToString("HHmm"))</Time>
    <AssemblyFileVersionAttribute>[assembly:System.Reflection.AssemblyFileVersion("$(Year).$(Month).$(Date).$(Time)")]</AssemblyFileVersionAttribute>
  </PropertyGroup>
  <Target Name="BeforeBuild">
    <WriteLinesToFile File="Properties\VersionInfo.cs" Lines="$(AssemblyFileVersionAttribute)" Overwrite="true">
    </WriteLinesToFile>
  </Target>

这将生成一个带有 AssemblyFileVersion 的 Assembly 属性的 VersionInfo.cs 文件,其中版本遵循 YY.MM.DD.TTTT 的架构和构建日期。您必须在项目中包含此文件并使用它进行构建。

于 2011-06-24T18:28:27.360 回答
17

安装构建版本增量加载项。它为您提供比 * 选项更多的控制权。

于 2009-04-22T05:20:26.187 回答
16

有一个 Visual Studio 扩展自动版本,它支持 Visual Studio(2012、2013、2015)2017 和 2019。

屏幕截图 在此处输入图像描述

在此处输入图像描述

于 2017-03-30T08:24:45.100 回答
13

要获取版本号,请尝试

 System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
 System.Reflection.AssemblyName assemblyName = assembly.GetName();
 Version version = assemblyName.Version;

要设置版本号,请创建/编辑 AssemblyInfo.cs

 [assembly: AssemblyVersion("1.0.*")]
 [assembly: AssemblyFileVersion("1.0.*")]

另外作为旁注,第三个数字是自 2000 年 2 月 1 日以来的天数,第四个数字是一天中总秒数的一半。所以如果你在午夜编译它应该是零。

于 2008-12-10T15:54:12.150 回答
8

如其他帖子中所述,在 AssemblyInfo 或项目属性中的版本号中设置 * 不适用于所有版本的 Visual Studio / .NET。

Afaik 它在 VS 2005 中不起作用(但在 VS 2003 和 VS 2008 中)。对于 VS 2005,您可以使用以下内容:Auto Increment Visual Studio 2005 version build and revision number on compile time

但请注意,不建议对强名称程序集自动更改版本号。原因是每次重建引用的程序集时都必须更新对此类程序集的所有引用,因为强名称程序集引用始终是对特定程序集版本的引用。仅当接口发生更改时,Microsoft 自己才会更改 .NET Framework 程序集的版本号。(注意:我仍在寻找我读到的 MSDN 中的链接。)

于 2008-12-10T15:56:24.703 回答
7

在 Visual Studio 2019 中

这对我来说还不够

[assembly: AssemblyVersion("1.0.*")]

构建它时会抛出这个错误

指定的版本字符串不符合要求的格式

解决方案

在我设置后格式终于被Deterministic接受Falseproject.csproj

<Deterministic>false</Deterministic>

编辑:

出于某种原因,设置Deterministic搞砸False了我的配置文件,加载它并将其保存在不同的位置。

解决方法:

我设置了一个构建后事件来增加修订号:

构建后事件批处理脚本

这将调用一个名为的 powershell 脚本autoincrement_version.ps1,将路径作为参数传递AssemblyInfo.cs

if $(ConfigurationName) == Release (
PowerShell -ExecutionPolicy RemoteSigned $(ProjectDir)autoincrement_version.ps1 '$(ProjectDir)My Project\AssemblyInfo.cs'
)

Poweshell 脚本

它使用正则表达式自动增加修订号

param( [string]$file );
  $regex_revision = '(?<=Version\("(?:\d+\.)+)(\d+)(?="\))'
  $found = (Get-Content $file) | Select-String -Pattern $regex_revision
  $revision = $found.matches[0].value
  $new_revision = [int]$revision + 1
  (Get-Content $file) -replace $regex_revision, $new_revision | Set-Content $file -Encoding UTF8
于 2019-05-24T16:27:09.397 回答
6

将递增 (DateTime) 信息添加到 AssemblyFileVersion 属性中,该属性具有不破坏任何依赖关系的优点。


基于 Boog 的解决方案(对我不起作用,可能是因为 VS2008?),您可以使用生成文件的预构建事件的组合,添加该文件(包括其版本属性),然后使用一种方式读出再次使用这些值。那是..

预建事件:

echo [assembly:System.Reflection.AssemblyFileVersion("%date:~-4,4%.%date:~-7,2%%date:~-10,2%.%time:~0,2%%time:~3,2%.%time:~-5,2%")] > $(ProjectDir)Properties\VersionInfo.cs

将生成的 VersionInfo.cs 文件(Properties 子文件夹)包含到您的项目中

获取日期的代码(几年到几秒):

var version = assembly.GetName().Version;
var fileVersionString = System.Diagnostics.FileVersionInfo.GetVersionInfo(assembly.Location).FileVersion;
Version fileVersion = new Version(fileVersionString);
var buildDateTime = new DateTime(fileVersion.Major, fileVersion.Minor/100, fileVersion.Minor%100, fileVersion.Build/100, fileVersion.Build%100, fileVersion.Revision);

不太舒服..另外,我不知道它是否会创建很多强制重建(因为文件总是会更改)。

例如,如果您仅每隔几分钟/小时更新 VersionInfo.cs 文件(通过使用临时文件,然后在检测到足够大的更改时复制/覆盖真实的 VersionInfo.cs),您可以使其更智能。我曾经非常成功地做到了这一点。

于 2012-07-10T18:37:31.577 回答
5

将版本号设置为“1.0.*”,它会自动用日期(从某个点开始的天数)和时间(从午夜开始的半秒)填充最后两个数字

于 2008-12-10T15:54:35.627 回答
5

它位于发布下的项目属性中

http://screencast.com/t/Vj7rhqJO
(〜http ://screencast.com/t/Vj7rhqJO

于 2008-12-10T15:55:03.880 回答
4

Cake支持 AssemblyInfo 文件打补丁。有了蛋糕,您就有无限的方法来实现自动版本递增。

像 C# 编译器这样递增版本的简单示例:

Setup(() =>
{
    // Executed BEFORE the first task.
    var datetimeNow = DateTime.Now;
    var daysPart = (datetimeNow - new DateTime(2000, 1, 1)).Days;
    var secondsPart = (long)datetimeNow.TimeOfDay.TotalSeconds/2;
    var assemblyInfo = new AssemblyInfoSettings
    {
        Version = "3.0.0.0",
        FileVersion = string.Format("3.0.{0}.{1}", daysPart, secondsPart)
    };
    CreateAssemblyInfo("MyProject/Properties/AssemblyInfo.cs", assemblyInfo);
});

这里:

  • 版本 - 是汇编版本。最佳做法是锁定主要版本号并保留零(如“1.0.0.0”)。
  • FileVersion - 是程序集文件版本。

请注意,您不仅可以修补版本,还可以修补所有其他必要信息

于 2016-03-03T19:27:56.073 回答
4

如何获取版本{major}.{year}.1{date}.1{time}

这是一种实验性的,但我喜欢它。灵感来自 Jeff Atwood @ CodingHorror(链接)。

生成的版本号变为1.2016.10709.11641(意思是 2016-07-09 16:41),它允许

  • 可怜的人零填充(带有愚蠢的前导1s)
  • 嵌入到版本号中的几乎人类可读的本地日期时间
  • 让主要版本单独进行真正重大的重大更改。

向您的项目添加一个新项目,选择 General -> Text Template,将其命名为类似的名称并(如果适用)CustomVersionNumber注释掉.AssemblyVersionAssemblyFileVersionProperties/AssemblyInfo.cs

然后,当保存此文件或构建项目时,这将重新生成一个文件,该.cs文件位于已创建文件下的子项中.tt

<#@ template language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>

//
// This code was generated by a tool. Any changes made manually will be lost
// the next time this code is regenerated.
//

using System.Reflection;

<#
    var date = DateTime.Now;
    int major = 1;
    int minor = date.Year;
    int build = 10000 + int.Parse(date.ToString("MMdd"));
    int revision = 10000 + int.Parse(date.ToString("HHmm"));
#>

[assembly: AssemblyVersion("<#= $"{major}.{minor}.{build}.{revision}" #>")]
[assembly: AssemblyFileVersion("<#= $"{major}.{minor}.{build}.{revision}" #>")]
于 2016-07-09T13:53:47.653 回答
3

前往项目 | 属性,然后是组装信息,然后是组装版本,并在最后一个或倒数第二个框中放一个 *(您不能自动增加主要或次要组件)。

于 2008-12-10T15:54:09.963 回答
2

截至目前,对于我的申请,

string ver = Application.ProductVersion;

返回ver = 1.0.3251.27860

值 3251 是自 2000 年 1 月 1 日以来的天数。我用它在我的应用程序的启动屏幕上放置版本创建日期。在与用户打交道时,我可以询问创建日期,这比一些长数字更容易沟通。

(我是一个支持小公司的单人部门。这种方法可能不适合你。)

于 2008-12-11T20:26:07.730 回答
2

使用 MSBuild 社区任务 ( http://msbuildtasks.tigris.org/ ) 项目中的 AssemblyInfo 任务,并将其集成到您的 .csproj/.vbproj 文件中。

它有许多选项,包括将版本号与一天中的日期和时间联系起来的选项。

受到推崇的。

于 2008-12-15T05:20:35.877 回答
2

也许,对于这个任务,你可以使用这样的代码:

    private bool IncreaseFileVersionBuild()
    {
        if (System.Diagnostics.Debugger.IsAttached)
        {
            try
            {
                var fi = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory).Parent.Parent.GetDirectories("Properties")[0].GetFiles("AssemblyInfo.cs")[0];
                var ve = System.Diagnostics.FileVersionInfo.GetVersionInfo(System.Reflection.Assembly.GetExecutingAssembly().Location);
                string ol = ve.FileMajorPart.ToString() + "." + ve.FileMinorPart.ToString() + "." + ve.FileBuildPart.ToString() + "." + ve.FilePrivatePart.ToString();
                string ne = ve.FileMajorPart.ToString() + "." + ve.FileMinorPart.ToString() + "." + (ve.FileBuildPart + 1).ToString() + "." + ve.FilePrivatePart.ToString();
                System.IO.File.WriteAllText(fi.FullName, System.IO.File.ReadAllText(fi.FullName).Replace("[assembly: AssemblyFileVersion(\"" + ol + "\")]", "[assembly: AssemblyFileVersion(\"" + ne + "\")]"));
                return true;
            }
            catch
            {
                return false;
            }
        }
        return false;
    }

并从表单加载中调用它。
使用此代码,您可以更新 AssemblyInfo.cs 中文件信息的任何部分(但您必须使用“标准”目录结构)。

于 2013-05-13T22:26:24.440 回答
2

更改 AssemblyInfo 在 VS2012 中有效。在 Visual Studio 中没有对此提供更多支持似乎很奇怪,您会认为这是构建/发布过程的基本部分。

于 2014-01-24T06:01:49.440 回答
2

我创建了一个应用程序来自动增加文件版本。

  1. 下载申请
  2. 将以下行添加到预构建事件命令行

    C:\temp\IncrementFileVersion.exe $(SolutionDir)\Properties\AssemblyInfo.cs

  3. 构建项目

为简单起见,该应用程序仅在出现错误时抛出消息,以确认它工作正常,您需要检查“程序集信息”中的文件版本

注意:您必须在 Visual Studio 中重新加载解决方案以获取“程序集信息”按钮以填充字段,但是您的输出文件将具有更新版本。

如有建议和要求,请发送电子邮件至 telson_alva@yahoo.com

于 2017-06-23T11:16:44.593 回答
1

装配信息实用程序。自由。开源。

于 2014-05-08T06:30:01.387 回答
1

我正在使用这种方法 https://stackoverflow.com/a/827209/3975786,将 T4 模板放在“解决方案项目”中,并将其与每个项目中的“添加为链接”一起使用。

于 2015-04-23T11:07:45.383 回答
1

也许在这里回答为时已晚,但希望这能解决某人的忙碌问题。

一种使用 PowerShell 脚本自动更改所有项目的程序集版本的方法。本文将解决您的许多问题。

于 2017-03-09T10:35:33.717 回答
0

每次我进行构建时,它都会自动增加最低有效数字。

我不知道如何更新其他人,但你至少应该已经看到了......

于 2008-12-10T15:54:06.563 回答
0

对于使用 Tortoise Subversion 的任何人,您可以将您的版本号之一与源代码的 subversion 修订号联系起来。我觉得这非常有用(审核员也非常喜欢这个!)。您可以通过在预构建中调用 WCREV 实用程序并从模板生成 AssemblyInfo.cs 来执行此操作。

如果您的模板名为 AssemblyInfo.wcrev 并且位于普通的 AssemblyInfo.cs 目录中,并且 tortoise 位于默认安装目录中,那么您的 Pre-Build 命令如下所示(注意全部在一行中):

"C:\Program Files\TortoiseSVN\bin\SubWCRev.exe" "$(ProjectDir)." "$(ProjectDir)Properties\AssemblyInfo.wcrev"  "$(ProjectDir)Properties\AssemblyInfo.cs"

模板文件将包含 wcrev 令牌替换字符串:$WCREV$,
例如

[assembly: AssemblyFileVersion("1.0.0.$WCREV$")]

注意:
由于您的 AssemblyInfo.cs 现在已生成,您不希望它受版本控制。

于 2020-03-23T11:03:39.633 回答