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




asp.net visual-studio (16)

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

如果我查找说C:\Windows\notepad.exe的属性,版本选项卡给出“文件版本: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

https://code.i-harness.com


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

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

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

  • 穷人零填充(与愚蠢的领先1秒)
  • 嵌入到版本号中的近乎人类可读的本地 DateTime
  • 只留下主要版本才能进行真正的重大改变。

将一个新项目添加到项目中,选择General - > Text Template,将其命名为CustomVersionNumber并在适用的情况下将Properties/AssemblyInfo.csAssemblyVersionAssemblyFileVersion注释掉。

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

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 - 是汇编文件版本。

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


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

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


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

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


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

Afaik它在VS 2005中不起作用(但在VS 2003和VS 2008中)。 对于VS 2005,您可以使用以下方法: http://www.codeproject.com/KB/dotnet/Auto_Increment_Version.aspx

但请注意,不建议对强名称程序集自动更改版本号。 原因在于,每次引用的程序集重新构建时,都必须更新对此程序集的所有引用,因为强名称的程序集引用始终是对特定程序集版本的引用。 只有在接口发生更改时,Microsoft自己才会更改.NET Framework程序集的版本号。 (注意:我仍在搜索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




将(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文件(属性子文件夹)包含到您的项目中

取回日期的代码(年至秒):

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),则可以使其变得更加智能。 我曾经很成功地做过这件事。


尝试获取版本号

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


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

  1. 下载Application
  2. 将以下行添加到预生成事件命令行中

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

  3. 建立该项目

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

注意:您将不得不在Visual Studio中重新加载解决方案中的'Assembly Information'按钮以填充字段,但是您的输出文件将具有更新版本。

对于建议和请求,请发送电子邮件至[email protected]


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

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


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


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


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

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


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







assemblyinfo