我只是想知道如何使用Visual Studio(2005)自动增加文件的构建(和版本?)
如果我查找C:\Windows\notepad.exe的属性,版本选项卡给出“文件版本:5.1.2600.2180”。我想在我的dll的版本中也得到这些很酷的数字,而不是版本1.0.0.0,让我们面对它有点沉闷。
我尝试了一些东西,但它似乎没有开箱即用的功能,或者可能我只是在错误的地方(像往常一样)。
我主要工作与网络项目....
我看了两个:
http://www.codeproject.com/KB/dotnet/Auto_Increment_Version.aspx
http://www.codeproject.com/KB/dotnet/build_versioning.aspx
我不敢相信花这么大力气做一件事是标准做法。
编辑:
据我所知,它在VS2005中不工作(http://www.codeproject.com/KB/dotnet/AutoIncrementVersion.aspx)
在Visual Studio 2019中
这对我来说还不够
[assembly: AssemblyVersion("1.0.*")]
在构建时,它抛出这个错误
指定的版本字符串不符合所需的格式
解决方案
在project.csproj中将Deterministic设置为False后,格式最终被接受
<Deterministic>false</Deterministic>
编辑:
出于某种原因,将Deterministic设置为False会使我的配置文件加载并保存在不同的位置。
处理:
我设置了一个构建后事件来增加版本号:
生成后事件批处理脚本
这将调用一个名为autoincrement_version的powershell脚本。ps1将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
打开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")]
to
[assembly: AssemblyVersion("1.0.*")]
//[assembly: AssemblyFileVersion("1.0.0.0")]
你可以在IDE中通过项目->属性->程序集信息来做到这一点
但是,这将只允许您自动增加程序集版本,并将为您提供
程序集文件版本:该字段不允许使用通配符(“*”)
消息框,如果您尝试在文件版本字段中放置*。
因此,只需打开assemblyinfo.cs并手动执行。
将递增(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),您可以使其更加智能。我曾经非常成功地做到过。
如何获取版本{major}.{year}.1{date}.1{time}
这个有点实验性,但我喜欢。灵感来自Jeff Atwood @ CodingHorror(链接)。
结果的版本号变成1.2016.10709.11641(意思是2016-07-09 16:41),这允许
可怜的男人零填充(愚蠢的前导1)
嵌入到版本号中的近乎人类可读的本地DateTime
对于真正重大的突破性更改,不要使用Major版本。
在项目中添加一个新项,选择General -> Text Template,将其命名为CustomVersionNumber,并(如果适用)在Properties/AssemblyInfo.cs中注释出AssemblyVersion和AssemblyFileVersion。
然后,在保存该文件或构建项目时,这将重新生成一个.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}" #>")]