使用Visual Studio时是否可以自动增加文件构build版本?

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

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

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

我主要与网站项目….

我看了两个:

  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 )

在Visual Studio 2008中,以下工作。

findAssemblyInfo.cs文件并find这两行:

 [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

打开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并手动完成。

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

 <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日的第三个版本,这将创build一个包含以下内容的VersionInfo.cs

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

然后必须将该文件添加到项目中(通过添加现有项目 ),并且必须从AssemblyInfo.cs删除AssemblyVersionAssemblyFileVersion行。

$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.chmVersion Properties中描述了用于更改版本组件的不同algorithm。

我想出了一个类似于基督徒的解决scheme,但不依赖社区MSBuild任务,这不是我的select,因为我不想为我们所有的开发人员安装这些任务。

我正在生成代码并编译到程序集,并希望自动增加版本号。 不过,我不能使用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文件,其版本遵循具有生成date的YY.MM.DD.TTTT的模式。 您必须将此文件包含在您的项目中并与之一起构build。

安装生成版本增量加载项。 它给你比*选项更多的控制权。

要获取版本号尝试

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

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

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

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

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

Afaik它没有在VS 2005(但在VS 2003和VS 2008)中工作。 对于VS 2005,您可以使用以下方法: 在编译时自动增加Visual Studio 2005版本的构build版本号 。

但请注意,不build议对强名称的程序集自动更改版本号。 原因在于,每次引用的程序集重build时,都必须更新对此程序集的所有引用,因为强名称程序集引用始终是对特定程序集版本的引用。 只有在接口发生变化时,Microsoft自己才能更改.NET Framework程序集的版本号。 (注意:我仍在searchMSDN中的链接,我读了这个链接。)

将版本号设置为“1.0。*”,它将自动填写最后两个数字,date(从某个时间点开始)和时间(午夜时间的一半)

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

屏幕截图 在这里输入图像描述

在这里输入图像描述

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


基于Boog的解决scheme(不适合我,也许是因为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文件(属性子文件夹)包含到您的项目中

取回date的代码(年至秒):

 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); 

不是很舒服..另外,我不知道它是否会产生很大的力量重build(因为文件总是变化)。

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

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

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

转到项目| 属性,然后程序集信息,然后程序集版本,并在最后或倒数第二个框(不能自动增加主要或次要组件)*。

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); }); 

这里:

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

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

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

它有许多选项,其中包括将版本号与date和时间绑定的选项。

推荐的。

截至目前,就我的申请而言,

 string ver = Application.ProductVersion; 

返回ver = 1.0.3251.27860

值3251是2000年1月1日以来的天数。 我用它来在我的应用程序的启animation面上添加一个版本创builddate。 在和用户打交道的时候,我可以问一下比较长的号码更容易沟通的创builddate。

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

更改AssemblyInfo在VS2012中工作。 这似乎很奇怪,在Visual Studio中没有更多的支持,你会认为这是构build/发布过程的基本部分。

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

这是一种实验,但我喜欢。 受Jeff Atwood @ CodingHorror启发( 链接 )。

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

  • 穷人零填充(与愚蠢的领先1秒)
  • embedded到版本号中的近乎人类可读的本地 DateTime
  • 只留下主要的版本是为了真正的重大突破。

添加一个新的项目到你的项目中,selectGeneral – > Text Template,将其命名为CustomVersionNumber并在适当情况下注释掉Properties/AssemblyInfo.csAssemblyVersionProperties/AssemblyInfo.cs

然后,在保存该文件或构build项目时,这将重新生成位于创build的.tt文件下的.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}" #>")] 

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

  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中文件信息的任何部分(但必须使用“标准”目录结构)。

AssemblyInfoUtil 。 自由。 开源。

也许在这里回答已经太迟了,但希望能够解决某个人的忙乱问题。

使用PowerShell脚本自动更改所有项目的汇编版本的方法。 本文将解决您的许多问题。

每次构build时,都会自动递增最不重要的数字。

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

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

  1. 下载应用程序
  2. 添加以下行预构build事件命令行

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

  3. build立这个项目

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

注意:您将不得不在Visual Studio中重新加载“Assembly Information”button的解决scheme来填充字段,但是您的输出文件将具有更新的版本。

对于build议和请求,请发送电子邮件至telson_alva@yahoo.com

在.NET中,程序集的版本信息遵循以下格式 – [ ]。

这个版本格式包含四个值:

 Major Version Minor Version Build Number Revision 

以上四个值可以用来表示不同的东西,取决于你如何让他们被理解。

当我们用.NET编译或者构build我们的代码(使用Visual Studio)时,它会输出程序集,并且这个程序集可以用三种不同types的版本来标记,如下所示:

 Assembly Version Assembly File Version Assembly Informational Version 

现在让我们花点时间了解这些内容以及它们如何或在哪些环境下使用。

试试这个解决scheme与video点击这里