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

时间:2008-12-10 15:51:06

标签: c# asp.net visual-studio version-control assemblyinfo

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

如果我查找说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
  3. 我无法相信做一些事情的努力是标准做法。

    编辑: 据我所知,它在VS2005中无效(http://www.codeproject.com/KB/dotnet/AutoIncrementVersion.aspx

25 个答案:

答案 0 :(得分:410)

在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

答案 1 :(得分:149)

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

答案 2 :(得分:52)

在每个版本中更改版本号的另一个选项是使用MSBuild.Community.Tasks版本任务。只需下载他们的安装程序,安装它,然后调整以下代码并将其粘贴到<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属性调整为您的语言环境。 It currently does not use the invariant culture.

对于2010年1月14日的第三次构建,这将创建一个包含此内容的VersionInfo.cs

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

然后必须将此文件添加到项目中(通过添加现有项),并且必须从{{1}中删除AssemblyVersionAssemblyFileVersion行}。

AssemblyInfo.cs版本属性中介绍了更改版本组件的不同算法。

答案 3 :(得分: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>

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

答案 4 :(得分:16)

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

答案 5 :(得分:12)

要获取版本号,请尝试

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

答案 6 :(得分:9)

有一个视觉工作室扩展Automatic Versions,它支持Visual Studio 2012,2013,2015&amp; 2017年。

屏幕截图 enter image description here

enter image description here

答案 7 :(得分: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中搜索我读过的链接。)

答案 8 :(得分: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),则可以使其更加智能化。我曾经非常成功地做过这件事。

答案 9 :(得分:5)

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

答案 10 :(得分:4)

它位于 发布

下的项目属性中

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

答案 11 :(得分: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 - 是汇编文件版本。

请注意,您不仅可以修补also all other necessary information的版本。

答案 12 :(得分:3)

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

答案 13 :(得分:2)

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

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

推荐。

答案 14 :(得分:2)

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

答案 15 :(得分:2)

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

string ver = Application.ProductVersion;

返回ver = 1.0.3251.27860

值3251是自2000年1月1日以来的天数。我用它将版本创建日期放在我的应用程序的初始屏幕上。在与用户打交道时,我可以要求创建日期比一些长号更容易沟通。

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

答案 16 :(得分:2)

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

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

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

  • 可怜的勒芒零填充(使用愚蠢的前导1
  • 几乎人类可读的本地 DateTime嵌入版本号
  • 单独使用Major版本进行真正的重大改变。

在项目中添加新项目,选择常规 - &gt;文字模板,将其命名为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}" #>")]

答案 17 :(得分:1)

也许,对于此任务,您可以使用以下代码:

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

答案 18 :(得分:1)

AssemblyInfoUtil。自由。开源的。

答案 19 :(得分:1)

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

答案 20 :(得分:1)

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

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

答案 21 :(得分:0)

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

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

答案 22 :(得分:0)

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

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

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

  3. 构建项目

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

    注意:您必须在Visual Studio中重新加载解决方案才能获得装配信息&#39;用于填充字段的按钮,但输出文件将具有更新版本。

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

答案 23 :(得分:0)

在Visual Studio 2019中

这对于我添加

是不够的
navbarBrandHref

在构建时会引发此错误

  

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


解决方案

[assembly: AssemblyVersion("1.0.*")] 中将Deterministic设置为False后,该格式终于被接受

project.csproj

答案 24 :(得分:0)

对于使用Tortoise Subversion的任何人,您都可以将其中一个版本号与源代码的Subversion修订号绑定在一起。我觉得这很有用(审核员也很喜欢!)。为此,您可以在预构建中调用WCREV实用程序,然后从模板生成AssemblyInfo.cs。

如果您的模板名为AssemblyInfo.wcrev且位于常规的AssemblyInfo.cs目录中,并且草龟位于默认的安装目录中,则您的Pre-Build命令如下所示(NB All一行):

"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时,您不希望对其进行版本控制。