2008-12-10 62 views
308

我只是想知道如何自動使用Visual Studio(2005)增加我的文件的構建(和版本?)。使用Visual Studio時可以自動增加文件構建版本嗎?

如果查找說的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

回答

374

在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

此作品爲別的一樣好,而在VS2005的作品。我是在代替希望一些有理數像1.0.1.56我得到1.0.3266.30135,但至少它(某些隨機數雖然是:d)增加 – inspite 2008-12-10 16:46:06

0

每次我做構建它自動遞增的最低顯著位。

我沒有任何想法如何更新的人,但你至少應該已經看到...

3

轉到Project |屬性,然後是裝配信息,然後裝配版本,並在最後一個或倒數第二個方框中放置*(不能自動增加主要或次要部件)。

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日以來,第四個數字是當天總秒數的一半。所以如果你在午夜編譯它應該是零。

144

打開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做到這一點通過Project - >屬性 - >裝配信息

不過,這將只允許您自動遞增彙編版本,並會給你

彙編文件版本:通配符(「*」)不允許在此字段

消息框如果您嘗試在文件版本字段中放置*。

所以只需打開assemblyinfo.cs並手動執行。

+0

是的,我剛剛遇到「」彙編文件版本:通配符(「*」)不允許在此字段中「這是什麼贏得了你的方法綠色刻度:D – inspite 2008-12-10 16:03:43

+0

這是否在VS2008中工作? – 2008-12-10 16:15:02

+0

在VS2005中不起作用安裝SP1看看會發生什麼 – inspite 2008-12-10 16:37:24

5

集的版本號爲「1.0。*」,它會自動填寫在過去兩年數量與(從一些點在天)的日期和時間(從午夜一半秒)

8

在集信息或親下設置的版本號*如其他帖子中所述的ject屬性不適用於所有版本的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中的鏈接,我在那裏讀到它)。

+0

我認爲對於任何版本的VS,您只能將*放在Build或Revision框中。我剛剛嘗試過使用VS 2005,它工作正常。我不確定該代碼項目文章的作者在談論什麼。 – MusiGenesis 2008-12-10 16:03:57

+0

也許它帶着一個服務包回來了,但是我記得它在我使用VS 2005時並沒有用到。 – 2008-12-10 16:11:33

+0

它在2005年不起作用,我將尋找一個服務包並報告回來。 – inspite 2008-12-10 16:14:36

2

至於現在,我的應用程序,

string ver = Application.ProductVersion; 

回報ver = 1.0.3251.27860

值3251是自1/1/2000的天數。我用它在我的應用程序的啓動畫面上放置了一個版本創建日期。在與用戶打交道時,我可以詢問比一些長號碼更容易溝通的創建日期。

(我一個人的部門支持的小公司,這種方法可能不適合你的工作。)

2

從的MSBuild社區任務(http://msbuildtasks.tigris.org/)項目使用的AssemblyInfo任務,並將其整合到您的.csproj/.vbproj文件。

它有多種選擇,其中包括一個扳平版本號的日期和時間。

推薦。

49

在每個版本中更改版本號的另一種方法是使用版本任務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> 

注:調整起始日期屬性爲您的區域。 It currently does not use the invariant culture.

有關2010年1月14日的第三構建,這將創建與此內容VersionInfo.cs

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

那麼該文件已被添加到項目中(通過添加現有項目),和必須從AssemblyInfo.cs中刪除AssemblyVersionAssemblyFileVersion行。

用於更改版本組件的不同算法在$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.chm版本屬性中描述。

19

我想出了類似的基督徒,但不依賴於社區的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大會屬性文件,其中版本如下YY.MM.DD.TTTT與構建日期的模式。您必須將此文件包含在您的項目中並使用它進行構建。

4

將遞增(DateTime)信息放入AssemblyFileVersion屬性中,該屬性的優點是不會打破任何依賴關係。在布格的解決方案


樓(我沒有工作,因爲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),就可以使其變得更加智能。我曾經很成功地做過這件事。

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中文件信息的任何部分(但必須使用「標準」目錄結構)。

2

更改AssemblyInfo在VS2012中的工作。這似乎很奇怪,在Visual Studio中沒有更多的支持,你會認爲這是構建/發佈過程的基本部分。

3

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

2

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

這一個是一種實驗性的,但我喜歡它。受Jeff Atwood @ CodingHorror啓發(link)。

所得版本號變爲1.2016.10709.11641(意味着2016年7月9日16時41分),這允許

  • 差芒零填充(與主導笨1 S)
  • 近人類可讀本地嵌入到版本號中的DateTime
  • 僅留下主要版本才能進行真正重大的重大更改。

添加一個新的項目到項目中,選擇常規 - >文本模板,將其命名爲類似CustomVersionNumber及(如適用)註釋掉Properties/AssemblyInfo.csAssemblyVersionAssemblyFileVersion

然後,保存此文件或構建項目時,將在創建的.tt文件下重新生成位於子項的.cs文件。

<#@ 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}" #>")] 
1

也許現在回答太遲了,但希望能解決某人的忙碌問題。

自動使用PowerShell腳本更改所有項目的程序集版本的方法。 This article將解決您的許多問題。

5

有一個Visual Studio擴展Automatic Versions支持的Visual Studio 2012,2013,2015年2017年&

屏幕截圖 enter image description here

enter image description here

0

我已經創建了一個應用程序來遞增文件版本自動。

  1. 下載Application
  2. 添加以下行預生成事件命令行

    C:\ TEMP \ IncrementFileVersion.exe $(SolutionDir)\屬性\ AssemblyInfo.cs中

  3. 生成該項目

爲了保持簡單,應用程序僅引發消息f有錯誤,爲確認它工作正常,您需要檢查'Assembly Information'中的文件版本

注意:您將不得不在Visual Studio中重新加載「Assembly Information」按鈕的填充字段但是,您的輸出文件將具有更新的版本。

對於建議和要求,請發送電子郵件至我[email protected]

0

在.NET中,程序集的版本信息如下格式如下 - []。

這個版本的格式包括四個值:

Major Version 
Minor Version 
Build Number 
Revision 

以上四種值可以用來表示不同的事情取決於你如何希望他們理解。

當我們編譯或.NET建立我們的代碼(使用Visual Studio),輸出組件和該組件可與三種不同類型的版本,這是如下標籤:

Assembly Version 
Assembly File Version 
Assembly Informational Version 

現在,讓我們花點時間瞭解這些內容以及他們如何或在何種環境下使用。

Try this solution with video click here

相關問題