2008-08-03 100 views
95

我想爲每個構建增加我的應用程序的版本屬性,但我不確定如何在Visual Studio(2005/2008)中啓用此功能。我試圖將AssemblyVersion指定爲1.0 *,但它並不能完全滿足我的要求。自動更新版本號

我也在使用一個設置文件,並且在程序集版本改變我的設置的早期嘗試中,由於應用程序在另一個目錄中查找設置文件而重置爲默認設置。

我希望能夠以1.1.38的形式顯示版本號,因此,當用戶發現問題時,我可以記錄他們正在使用的版本,並告訴他們如果他們有舊版本。

對版本控制工作原理的簡短解釋也將被讚賞。構建版本和修訂版本號何時增加?

+0

下面的問題有一個簡單的方便的解決方案,以便如何通過在構建事件中生成源文件來將構建號注入到您的應用程序中。 http://stackoverflow.com/questions/4450231/can-i-make-a-constant-from-a-compile-time-env-variable-in-csharp – 2012-04-29 23:54:46

+0

可能重複的[我可以自動增加文件構建版本當使用Visual Studio?](https://stackoverflow.com/questions/356543/can-i-automatically-increment-the-file-build-version-when-using-visual-studio) – 2017-10-28 04:34:45

回答

84

隨着「內置」的東西,你不能,因爲使用1.0。*或1.0.0。*將取代版本和編號的日期/時間戳,這通常也是一個好方法。

有關詳細信息,請參閱/ v標記中的Assembly Linker文檔。

至於自動遞增號碼,使用的AssemblyInfo任務:

AssemblyInfo Task

這可被配置爲自動遞增版本號。

有2個陷阱:

  1. 每個版本字符串的4個數字被限制在65535。這是Windows的限制,不可能得到解決。
  2. 使用與Subversion需要一個小的變化:

檢索版本號爲那麼很容易:

Version v = Assembly.GetExecutingAssembly().GetName().Version; 
string About = string.Format(CultureInfo.InvariantCulture, @"YourApp Version {0}.{1}.{2} (r{3})", v.Major, v.Minor, v.Build, v.Revision); 

而且,爲了澄清:在.NET或至少在C#中,構建實際上是第三個數字,而不是第四個像有些人(例如德爾福開發誰是用來Major.Minor.Release .Build)可能會有所期待。

在.net中,它是Major.Minor.Build.Revision。

+3

我剛剛發現這個視覺工作室插件,做類似的事情:http://autobuildversion.codeplex.com/ – jrsconfitto 2010-05-27 18:15:18

+6

這是否意味着在2179年6月4日微軟的默認版本號將打破? (2000年後的第65536天) – ThePower 2011-11-07 14:35:44

+1

@Jugglingnutcase - 如果它適用於當前版本的visual studio – 2015-06-03 20:31:01

6

您使用的是什麼源碼控制系統?

幾乎所有的人都有某種形式的$ id $標籤時,在文件中檢查出被擴大。

我通常使用某種形式的兩輪牛車來顯示這是版本號。

另一種方法是使用使用日期作爲版本號:080803-1448

1

前一段時間我寫了一個快速和骯髒的exe文件,將更新版本號的在集信息{CS/vb} - 我還使用rxfind.exe(一個簡單而強大的基於正則表達式的搜索替換工具)作爲構建過程的一部分從命令行執行更新。一些其他幫助提示:

  1. 將assemblyinfo分離爲產品部件(公司名稱,版本等)和部件特定部件(部件名稱等)。請參閱here
  2. 另外 - 我使用subversion,所以我發現將內部版本號設置爲subversion版本號會很有幫助,因此可以很容易地返回到生成程序集的代碼庫(例如,1.4.100.1502是從修訂版1502)。
19

VS.NET默認程序集的版本爲1.0 *和使用以下邏輯時自動遞增的:它集生成部分,自2000年1月1日的天數,並將一部分修改的自午夜以來的秒數,當地時間除以2。看到這個MSDN article

程序集版本位於assemblyinfo.vb或assemblyinfo.cs文件中。從文件:

' Version information for an assembly consists of the following four values: 
' 
'  Major Version 
'  Minor Version 
'  Build Number 
'  Revision 
' 
' 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")> 
0

如果你想每一個編譯完成時更新自動遞增數字,你可以使用VersionUpdater從預生成事件。如果您願意,您的預構建事件可以檢查構建配置,以便版本號僅針對發佈版本(例如)增量。

8

我發現它運作良好,簡單地使用下面的顯示在任何需要的產品版本,最後生成日期:

System.IO.File.GetLastWriteTime(System.Reflection.Assembly.GetExecutingAssembly().Location).ToString("yyyy.MM.dd.HH.mm.ss") 

,而不是試圖從類似下面得到的版本:

System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly(); 
object[] attributes = assembly.GetCustomAttributes(typeof(System.Reflection.AssemblyFileVersionAttribute), false); 
object attribute = null; 

if (attributes.Length > 0) 
{ 
    attribute = attributes[0] as System.Reflection.AssemblyFileVersionAttribute; 
} 
2

[Visual Studio中2017,的.csproj性質]

要自動更新您的PackageVersion/Version/AssemblyVersion屬性(或任何其他屬性),首先創建一個新的Microsoft.Build.Utilities.Task類,該類將獲得您當前的內部版本號併發送更新後的編號(我建議爲此創建單獨的項目類)。

我手動更新MAJOR.MINOR數字,但讓MSBuild的自動更新版本號(1.1。,1.1。,1.1。等:)

using Microsoft.Build.Framework; 
using System; 
using System.Collections.Generic; 
using System.Text; 

public class RefreshVersion : Microsoft.Build.Utilities.Task 
{ 
    [Output] 
    public string NewVersionString { get; set; } 
    public string CurrentVersionString { get; set; } 

    public override bool Execute() 
    {  
     Version currentVersion = new Version(CurrentVersionString ?? "1.0.0"); 

     DateTime d = DateTime.Now; 
     NewVersionString = new Version(currentVersion.Major, 
      currentVersion.Minor, currentVersion.Build+1).ToString(); 
     return true; 
    } 

} 

然後打電話給你最近創建的任務在MSBuild過程中添加你的下一個代碼。的csproj文件:

<Project Sdk="Microsoft.NET.Sdk">  
... 
<UsingTask TaskName="RefreshVersion" AssemblyFile="$(MSBuildThisFileFullPath)\..\..\<dll path>\BuildTasks.dll" /> 
<Target Name="RefreshVersionBuildTask" BeforeTargets="Pack" Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'"> 
    <RefreshVersion CurrentVersionString="$(PackageVersion)"> 
      <Output TaskParameter="NewVersionString" PropertyName="NewVersionString" />    
    </RefreshVersion> 
    <Message Text="Updating package version number to $(NewVersionString)..." Importance="high" /> 
    <XmlPoke XmlInputPath="$(MSBuildProjectDirectory)\mustache.website.sdk.dotNET.csproj" Query="/Project/PropertyGroup/PackageVersion" Value="$(NewVersionString)" /> 
</Target> 
... 
<PropertyGroup> 
.. 
<PackageVersion>1.1.4</PackageVersion> 
.. 

當選擇的Visual Studio包項目選項(只是改變BeforeTargets="Build"爲構建之前執行任務)的RefreshVersion代碼將被觸發來計算新的版本號,並XmlPoke任務將更新您的.csproj財產相應(是的,它會修改文件)。

在使用NuGet庫時,我還通過將下一個構建任務添加到上一個示例中,將包發送到NuGet存儲庫。

<Message Text="Uploading package to NuGet..." Importance="high" /> 
<Exec WorkingDirectory="$(MSBuildProjectDirectory)\bin\release" Command="c:\nuget\nuget push *.nupkg -Source https://www.nuget.org/api/v2/package" IgnoreExitCode="true" /> 

c:\nuget\nuget是我擁有的NuGet客戶端(記住通過調用nuget SetApiKey <my-api-key>保存您的NuGet API密鑰或包括在的NuGet推通話鍵)。

以防萬一它幫助某人^ _ ^。