使用Visual Studio时,我可以自动增加文件构建版本吗?

ins*_*ite 347 c# asp.net version-control assemblyinfo visual-studio

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

如果我查找say的属性C:\Windows\notepad.exe,Version选项卡会显示"File version: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)

Sam*_*rum 423

在Visual Studio 2008中,以下工作原理.

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

[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
Run Code Online (Sandbox Code Playgroud)

您可以尝试将其更改为:

[assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyFileVersion("1.0.*")]
Run Code Online (Sandbox Code Playgroud)

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

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

[assembly: AssemblyVersion("1.0.*")]
Run Code Online (Sandbox Code Playgroud)

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

  • 我意识到这是一个老问题,但是想要为那些找到答案的人添加这个评论.如果增加AssemblyVersion,则需要重新编译使用您的dll的任何项目.但是,如果保持AssemblyVersion相同并自行增加AssemblyFileVersion,那么您可以交换新的dll,而无需重新编译使用它的任何内容.所以问问自己,这只是一个新版本,还是我发布了新版本? (76认同)
  • @ DD59'Build'是自2000年1月1日以来的天数; 'Revision'是从午夜开始的秒数*除以*(不是半秒,而是两秒间隔).见这里:http://stackoverflow.com/a/3387167/11545 (27认同)
  • 很好的调用需要删除AssemblyFileVersion属性以使其工作! (18认同)
  • 哦,我只是读它:它将自动填入最后两个数字与日期(从某一点开始的几天)和时间(午夜的一半) (14认同)
  • 这和其他任何东西都一样好,并且可以在VS2005中运行.我希望得到一些像1.0.1.56这样的有理数,我得到的是1.0.3266.30135,但至少它增加了(尽管有一些随机数:D) (2认同)
  • @JustinKrejcha 然而 24 小时只有 86400 秒......<暮光区音乐> (2认同)

Hat*_*ath 153

打开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")]
Run Code Online (Sandbox Code Playgroud)

[assembly: AssemblyVersion("1.0.*")]
//[assembly: AssemblyFileVersion("1.0.0.0")]
Run Code Online (Sandbox Code Playgroud)

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

但是,这只允许您自动增加Assembly版本并将为您提供

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

如果您尝试在文件版本字段中放置*,请使用消息框.

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

  • 我小心使用*它将在2179年6月4日停止工作,当天变为65536 (44认同)
  • 在发布周期期间更改AssemblyVersion编号是不可取的.相反,应该更改AssemblyFileVersion.请参阅我关于此主题的博客文章:http://philippetruche.wordpress.com/2008/08/12/net-assembly-versioning-lifecycle/另请参阅Suzanne Cook关于何时更改数字的优秀帖子:http:// blogs .msdn.com/b/suzcook /存档/ 2003/05 /第29/57148.aspx (4认同)
  • 这工作:[assembly:AssemblyVersion("1.0.*")] // [assembly:AssemblyFileVersion("1.0.0.0")] (3认同)
  • @Shimmy:将<Deterministic> False </ Deterministic>添加到.csproj [Visual Studio 2017(.NET Core)中的自动版本控制](// stackoverflow.com/a/46985624) (3认同)

Chr*_*ian 53

在每个版本中更改版本号的另一个选项是使用MSBuild.Community.TasksVersion任务.只需下载他们的安装程序,安装它,然后调整以下代码并将其粘贴到您的文件中:<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>
Run Code Online (Sandbox Code Playgroud)

注意:将StartDate属性调整为您的语言环境.它目前不使用不变文化.

对于2010年1月14日的第三次构建,这将VersionInfo.cs使用以下内容创建:

[assembly: AssemblyVersion("1.0")]
[assembly: AssemblyFileVersion("1.0.14.2")]
Run Code Online (Sandbox Code Playgroud)

然后必须将此文件添加到项目中(通过添加现有项目),并且必须从中删除AssemblyVersionAssemblyFileVersionAssemblyInfo.cs.

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

  • 这是我见过的最好的方法,可以解决FileVersion结构使用16位整数的可怕事实. (2认同)

Boo*_*oog 24

我想出了一个类似于基督徒的解决方案,但不依赖于社区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>
Run Code Online (Sandbox Code Playgroud)

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

  • 对于想要关注 [calver](https://calver.org) 的人来说,这是一个极好的解决方案!我的+1。我要简化的一件事是变量:`&lt;Date&gt;$([System.DateTime]::Now.ToString("yyyy.MdHHmm"))&lt;/Date&gt;`。奇迹般有效。 (2认同)

小智 16

安装Build Version Increment加载项.它为您提供了比*选项更多的控制.

  • 我正在为VS2012使用[自动版本](https://visualstudiogallery.msdn.microsoft.com/dd8c5682-58a4-4c13-a0b4-9eadaba919fe),它运行良好. (2认同)

Bob*_*Bob 12

要获取版本号,请尝试

 System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
 System.Reflection.AssemblyName assemblyName = assembly.GetName();
 Version version = assemblyName.Version;
Run Code Online (Sandbox Code Playgroud)

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

 [assembly: AssemblyVersion("1.0.*")]
 [assembly: AssemblyFileVersion("1.0.*")]
Run Code Online (Sandbox Code Playgroud)

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


Rah*_*hul 11

有一个visual studio扩展自动版本,支持Visual Studio 2012,2013,2015和2017.

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

在此输入图像描述

  • 它在2017年对我不起作用! (2认同)
  • @Maxim试用最新版本,它应该适用于VS 2017 (2认同)

Dir*_*mar 8

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

Afaik它在VS 2005中不起作用(但在VS 2003和VS 2008中).对于VS 2005,您可以使用以下内容:在编译时自动增加Visual Studio 2005版本和版本号.

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


And*_*iff 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
Run Code Online (Sandbox Code Playgroud)

将生成的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);
Run Code Online (Sandbox Code Playgroud)

不太舒服..而且,我不知道它是否会产生很多强制重建(因为文件总是在变化).

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


小智 6

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

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

生成的版本号变为1.2016.10709.11641(意味着 2016-07-09 16:41),这允许

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

将新项目添加到您的项目中,选择常规 -> 文本模板,将其命名为CustomVersionNumber和 (如果适用)注释掉中的AssemblyVersion和。AssemblyFileVersionProperties/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}" #>")]
Run Code Online (Sandbox Code Playgroud)


Jam*_*ran 5

将版本号为"1.0.*",它会在最后两个数字与(从一些点在天)的日期自动填充和时间(从午夜一半秒)


Ale*_*lex 5

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

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


Mad*_*col 5

在 Visual Studio 2019 中

这对我来说还不够

[assembly: AssemblyVersion("1.0.*")]
Run Code Online (Sandbox Code Playgroud)

构建它时会抛出这个错误

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

解决方案

格式后,我组终于接受了DeterministicFalseproject.csproj

<Deterministic>false</Deterministic>
Run Code Online (Sandbox Code Playgroud)

编辑:

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

解决方法:

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

构建后事件批处理脚本

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

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

Poweshell 脚本

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

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