c# - 版本號 - 組件版本檔案版本




如何有一個自動遞增版本號(Visual Studio)? (6)

這個問題在這裡已經有了答案:

我想存儲一組在編譯時自動遞增的整數:

int MajorVersion = 0;
int MinorVersion = 1;
int Revision = 92;

當我編譯時,它會自動增加Revision 。 當我構建安裝項目時,它會增加MinorVersion (我可以手動執行此操作)。 MajorVersion只能手動遞增。

然後,我可以在菜單Help / About中向用戶顯示版本號,如下所示:

  Version: 0.1.92

這怎麼能實現?

這個問題不僅要求如何有一個自動遞增的版本號,而且要求如何在代碼中使用它,這是比其他更完整的答案。


以下是來自MSDN的AssemblyInfo.cs報價

您可以指定所有值,也可以使用星號( 來接受默認版本號,修訂版號或兩者 例如,[assembly:AssemblyVersion(“2.3.25.1”)]表示2為主要版本,3表示次要版本,25表示內部版本號,1表示版本號。 諸如[assembly:AssemblyVersion(“1.2。 ”)] 的版本號指定1為主要版本,2為次要版本,並接受默認版本號和修訂版號。 版本號如[assembly:AssemblyVersion(“1.2.15。*”)]指定1為主要版本,2為次要版本,15為內部版本號,並接受默認版本號。 默認的內部版本號每天增加。 默認版本號是隨機的

這有效地說,如果您將1.1。*納入程序集信息中,則只有內部版本號會自動增加,並且不會在每次構建後發生,而是每天發生。 版本號會改變每個版本,但是是隨機的,而不是以增量的方式。

對於大多數用例而言,這可能就足夠了。 如果這不是你想要的,那麼你就不得不編寫一個腳本,它會在預生成步驟中自動增加版本#


使用AssemblyInfo.cs

在App_Code中創建文件:並填寫以下內容或使用Google獲取其他屬性/屬性的可能性。

AssemblyInfo.cs中

using System.Reflection;

[assembly: AssemblyDescription("Very useful stuff here.")]
[assembly: AssemblyCompany("companyname")]
[assembly: AssemblyCopyright("Copyright © me 2009")]
[assembly: AssemblyProduct("NeatProduct")]
[assembly: AssemblyVersion("1.1.*")]

AssemblyVersion是你真正追求的部分。

然後,如果您在網站,任何aspx頁面或控件上工作,則可以在<Page>標記中添加以下內容:

CompilerOptions="<folderpath>\App_Code\AssemblyInfo.cs"

(當然用適當的變量替換folderpath)。

我不相信你需要以任何方式為其他類添加編譯器選項; App_Code中的所有應用程序在編譯時都會收到版本信息。

希望有所幫助。


如果將AssemblyInfo類添加到項目中,並將AssemblyVersion屬性修改為以星號結尾,例如:

[assembly: AssemblyVersion("2.10.*")]

視覺工作室會根據這些規則為你增加最後的數字(感謝galets,我完全錯了!)

要在代碼中引用此版本,可以將其顯示給用戶,請使用反射。 例如,

Version version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
DateTime buildDate = new DateTime(2000, 1, 1)
                        .AddDays(version.Build).AddSeconds(version.Revision * 2);
string displayableVersion = $"{version} ({buildDate})";

你應該知道兩個重要的陷阱

來自@ ashes999:

值得注意的是,如果AssemblyVersionAssemblyFileVersion都指定了,那麼在你的.exe文件中就不會看到這個了。

來自@ BrainSlugs83:

只將第四個數字設置為*可能很糟糕,因為版本不會始終增加。 第三個數字是自2000年以來的天數,第四個數字是自午夜以來的秒數(除以2)[IT並非隨機]。 因此,如果您在一天的某一天晚些時候以及第二天的某天早些時候構建解決方案,那麼稍後的版本將具有較早的版本號。 我建議您始終使用XY*代替XYZ*因為您的版本號總是會以這種方式增加。


您可以使用Visual Studio中T4模板機制從簡單的文本文件生成所需的源代碼

我想為某些.NET項目配置版本信息生成。 自從我調查可用選項已經很長時間了,所以我搜索了各地,希望找到一些簡單的方法來做到這一點。 我發現的結果並不令人鼓舞:人們編寫Visual Studio加載項和自定義的MsBuild任務只是為了獲得一個整數(好的,也許是兩個)。 這對於一個小型的個人項目來說感覺過分了。

靈感來自討論之一,有人建議T4模板可以完成這項工作。 當然他們可以。 該解決方案需要最小的努力,並且不需要Visual Studio或構建流程定制。 這裡應該做什麼:

  1. 創建一個擴展名為“.tt”的文件,並在那裡放置將生成AssemblyVersion和AssemblyFileVersion屬性的T4模板:
<#@ template language="C#" #>
// 
// This code was generated by a tool. Any changes made manually will be lost
// the next time this code is regenerated.
// 

using System.Reflection;

[assembly: AssemblyVersion("1.0.1.<#= this.RevisionNumber #>")]
[assembly: AssemblyFileVersion("1.0.1.<#= this.RevisionNumber #>")]
<#+
    int RevisionNumber = (int)(DateTime.UtcNow - new DateTime(2010,1,1)).TotalDays;
#>

你將不得不決定版本號生成算法。 對於我來說,自動生成一個修訂版號就足夠了,該修訂版號設置為自2010年1月1日以來的天數。正如您所看到的,版本生成規則是用純C#編寫的,因此您可以根據需要輕鬆調整它。

  1. 上面的文件應該放在其中一個項目中。 我使用這個單一文件創建了一個新項目,使版本管理技術變得清晰。 當我構建這個項目時(實際上我甚至不需要構建它:保存文件足以觸發Visual Studio操作),將生成以下C#代碼:
// 
// This code was generated by a tool. Any changes made manually will be lost
// the next time this code is regenerated.
// 

using System.Reflection;

[assembly: AssemblyVersion("1.0.1.113")]
[assembly: AssemblyFileVersion("1.0.1.113")]

是的,今天是2010年1月1日以來的113天。明天版本號會改變。

  1. 下一步是從應該共享相同自動生成版本信息的所有項目中的AssemblyInfo.cs文件中刪除AssemblyVersion和AssemblyFileVersion屬性。 相反,為每個項目選擇“添加現有項目”,使用T4模板文件導航到文件夾,選擇相應的“.cs”文件並將其添加為鏈接。 這將做到!

我喜歡這種方法是輕量級的(沒有自定義的MsBuild任務),並且自動生成的版本信息不會添加到源代碼管理中。 當然,使用C#進行版本生成算法會打開任何復雜的算法。


您可以嘗試使用Matt Griffith的UpdateVersion 。 現在已經很老了,但效果很好。 要使用它,只需要設置一個預生成事件,該事件指向AssemblyInfo.cs文件,應用程序將根據命令行參數相應地更新版本號。

由於應用程序是開源的,我還創建了一個版本來使用格式(主要版本)(次要版本)。([year] [dayofyear])。(increment)來增加版本號。 有關這方面的更多信息和修訂後的代碼可以在我的博客文章Assembly Version Numbers和.NET上找到

更新:我已經在GitHub上為我的UpdateVersion應用程序的修改版本添加了代碼: https://github.com/munr/UpdateVersionhttps://github.com/munr/UpdateVersion


這是我對T4建議的實現......每次構建項目時都會增加內部版本號,而不管選擇的配置如何(即Debug | Release),並且每次執行Release版本時都會增加版本號。 您可以通過應用程序➤程序集信息...繼續更新主版本號和次版本號

為了更詳細地解釋,這將讀取現有的AssemblyInfo.cs文件,並使用正則表達式來查找AssemblyVersion信息,然後根據TextTransform.exe輸入增加修訂版本和內部版本號。

  1. 刪除您現有的AssemblyInfo.cs文件。
  2. 在它的位置創建一個AssemblyInfo.tt文件。 在保存T4文件後,Visual Studio應創建AssemblyInfo.cs並將其與T4文件分組。

    <#@ template debug="true" hostspecific="true" language="C#" #>
    <#@ output extension=".cs" #>
    <#@ import namespace="System.IO" #>
    <#@ import namespace="System.Text.RegularExpressions" #>
    <#
        string output = File.ReadAllText(this.Host.ResolvePath("AssemblyInfo.cs"));
        Regex pattern = new Regex("AssemblyVersion\\(\"(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<revision>\\d+)\\.(?<build>\\d+)\"\\)");
        MatchCollection matches = pattern.Matches(output);
        if( matches.Count == 1 )
        {
            major = Convert.ToInt32(matches[0].Groups["major"].Value);
            minor = Convert.ToInt32(matches[0].Groups["minor"].Value);
            build = Convert.ToInt32(matches[0].Groups["build"].Value) + 1;
            revision = Convert.ToInt32(matches[0].Groups["revision"].Value);
            if( this.Host.ResolveParameterValue("-","-","BuildConfiguration") == "Release" )
                revision++;
        }
    #>
    
    using System.Reflection;
    using System.Runtime.CompilerServices;
    using System.Runtime.InteropServices;
    using System.Resources;
    
    // General Information
    [assembly: AssemblyTitle("Insert title here")]
    [assembly: AssemblyDescription("Insert description here")]
    [assembly: AssemblyConfiguration("")]
    [assembly: AssemblyCompany("Insert company here")]
    [assembly: AssemblyProduct("Insert product here")]
    [assembly: AssemblyCopyright("Insert copyright here")]
    [assembly: AssemblyTrademark("Insert trademark here")]
    [assembly: AssemblyCulture("")]
    
    // Version informationr(
    [assembly: AssemblyVersion("<#= this.major #>.<#= this.minor #>.<#= this.revision #>.<#= this.build #>")]
    [assembly: AssemblyFileVersion("<#= this.major #>.<#= this.minor #>.<#= this.revision #>.<#= this.build #>")]
    [assembly: NeutralResourcesLanguageAttribute( "en-US" )]
    
    <#+
        int major = 1;
        int minor = 0;
        int revision = 0;
        int build = 0;
    #>
    
  3. 將此添加到您的預生成事件中:

    "%CommonProgramFiles(x86)%\microsoft shared\TextTemplating\$(VisualStudioVersion)\TextTransform.exe" -a !!BuildConfiguration!$(Configuration) "$(ProjectDir)Properties\AssemblyInfo.tt"
    




versioning