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

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

如果我查找C:\Windows\notepad.exe的属性,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

我不敢相信花这么大力气做一件事是标准做法。

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

239756 次浏览

每次构建时,它都会自动增加最低有效位数。

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

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

要获得版本号,请尝试

 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日以来的天数,第四个数字是当天总秒数的一半。所以如果你在午夜编译,它应该是0。

打开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并手动执行。

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

它在你的项目属性< em > < / em >发布

http://screencast.com/t/Vj7rhqJO
(~ http://screencast.com/t/Vj7rhqJO) < / p >

如其他文章所述,在AssemblyInfo中的版本号中或在项目属性下设置*并不适用于所有版本的Visual Studio / . net。

Afaik,它在2005年的比赛中不起作用(但在2003年和2008年的比赛中不起作用)。对于VS 2005,你可以使用下面的方法:

但是请注意,对于强名称程序集,不建议自动更改版本号。原因是,每次重新构建所引用的程序集时,必须更新对此类程序集的所有引用,因为强名称程序集引用始终是对特定程序集版本的引用。微软自己只有在接口发生变化时才会更改. net框架程序集的版本号。(注意:我还在MSDN上搜索我读到的链接。)

在visual Studio 2008中,下面的作品。

找到AssemblyInfo.cs文件并找到这两行:

[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

从现在开始,对于我的申请,

string ver = Application.ProductVersion;

返回ver = 1.0.3251.27860

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

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

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

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

推荐。

安装构建版本增量插件。它给了你比*选项更多的控制。

在每次构建中更改版本号的另一个选项是使用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日的第三个版本,这将创建一个包含以下内容的VersionInfo.cs:

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

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

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

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

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

将递增(DateTime)信息放入AssemblyFileVersion属性,该属性的优点是不破坏任何依赖关系。


基于Boog的解决方案(不适合我,也许是因为VS2008?),你可以结合使用一个预构建事件生成一个文件,添加该文件(包括其版本属性),然后使用一种方法再次读取这些值。这是. .

Pre-Build-Event:

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),您可以使其更加智能。我曾经非常成功地做到过。

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

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

并从form loading调用它 使用这段代码,您可以在AssemblyInfo.cs中更新文件信息的任何部分(但必须使用“标准”目录结构)

在VS2012中可以更改AssemblyInfo。奇怪的是,Visual Studio中对此没有更多的支持,你会认为这是构建/发布过程的基本部分。

AssemblyInfoUtil。免费的。开源的。

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

蛋糕支持对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);
});

在这里:

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

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

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

这个有点实验性,但我喜欢。灵感来自Jeff Atwood @ CodingHorror (链接)。

结果的版本号变成1.2016.10709.11641(意思是2016-07-09 16:41),这允许

  • 可怜人的零填充(使用愚蠢的前导__abc0)
  • 接近人类可读的当地的 DateTime嵌入到版本号中
  • 对于真正重大的突破性更改,不要使用Major版本。

在你的项目中添加一个新项目,选择General ->文本模板,将其命名为CustomVersionNumber,并(如果适用)注释掉Properties/AssemblyInfo.cs中的AssemblyVersionAssemblyFileVersion

然后,当保存该文件或构建该项目时,这将重新生成一个.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}" #>")]

也许现在回答这个问题已经太迟了,但希望这能解决一些人忙碌的问题。

一个自动方法改变汇编版本的所有项目使用PowerShell脚本。这篇文章将解决你的许多问题。

有一个visual studio扩展自动版本支持visual studio (2017,2019 &2022)

< >强屏幕截图 enter image description here < / p >

enter image description here

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

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

    C: \ temp \ IncrementFileVersion.exe $ (SolutionDir) \ \属性AssemblyInfo.cs < / p >

  3. 构建项目

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

注意:您必须在Visual studio中重新加载“装配信息”按钮来填充字段,但是您的输出文件将具有更新版本。

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

在Visual Studio 2019中

这对我来说还不够

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

在构建时,它抛出这个错误

指定的版本字符串不符合所需的格式

解决方案

在我在project.csproj中将Deterministic设置为False后,该格式最终被接受

<Deterministic>false</Deterministic>

编辑:

出于某种原因,将Deterministic设置为False会使我的配置文件加载并保存在不同的位置。

处理:

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

生成后事件批处理脚本

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

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

Poweshell脚本

它使用Regex自动增加修订号

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

对于任何使用Tortoise Subversion的人,您可以将您的版本号之一绑定到源代码的Subversion修订号。我发现这非常有用(审计人员也非常喜欢!)。您可以通过在预构建中调用WCREV实用程序并从模板生成AssemblyInfo.cs来实现这一点。

如果您的模板名为AssemblyInfo。wcrev位于正常的AssemblyInfo.cs目录中,而tortoise位于默认的安装目录中,那么你的预构建命令看起来像这样(注意,都在一行中):

"C:\Program Files\TortoiseSVN\bin\SubWCRev.exe" "$(ProjectDir)." "$(ProjectDir)Properties\AssemblyInfo.wcrev"  "$(ProjectDir)Properties\AssemblyInfo.cs"
模板文件将包含wcrev令牌替换字符串:$ wcrev $
例如。< br > < / p >
[assembly: AssemblyFileVersion("1.0.0.$WCREV$")]
< p >注意:< br > 当您的AssemblyInfo.cs现在生成时,您不希望它受到版本控制

我用Visual Studio 2019尝试了这个,它不工作。 在较新的VS版本中,至少确定性标志阻止了自动更新。但是改变了第14行 您的项目名。csproj到<Deterministic>false</Deterministic> 将版本号字符串改为“1.0.*”;

所以我做了一个小vbs脚本来完成这项工作。 它将版本号更改为(主要版本)。(小版本)。[一][dayofyear])。(增量)。< / p >

将脚本复制到一个文件夹中,并将以下内容放入pre-compile build-commandline:

"Path-to-this-script\UpdateVersion.vbs"  "$(ProjectDir)"

(包括引号和填写您的机器的真实路径) and You are done.

这里得到它: https://github.com/abtzero/VS_UpdateVersion.git < / p >