Как получить автоматически увеличивающийся номер версии (Visual Studio)?

Я хочу сохранить набор целых чисел, которые автоматически увеличиваются во время сборки:

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

Когда я скомпилирую, он будет автоматически увеличивать Revision . Когда я MinorVersion проект установки, он будет увеличивать MinorVersion (я в порядке с этим вручную). MajorVersion будет увеличиваться только вручную.

Затем я мог отображать номер версии в меню Help / About для пользователя как:

   Версия: 0.1.92

Как это можно достичь?

Этот вопрос задает вопрос не только о том, как иметь номер с добавочным числом, а также как использовать его в коде, который является более полным ответом, чем другие.

Если вы добавите class AssemblyInfo в свой проект и измените атрибут AssemblyVersion, чтобы завершить его звездочкой, например:

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

Визуальная студия увеличит окончательный номер для вас в соответствии с этими правилами (спасибо галеатам, у меня это было совершенно неправильно!)

Чтобы ссылаться на эту версию в коде, чтобы вы могли отобразить ее пользователю, вы используете reflection. Например,

 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:

Также стоит отметить, что если указаны как AssemblyVersion и AssemblyFileVersion , вы не увидите это на своем .exe.

От @ BrainSlugs83:

Установка только 4-го числа * может быть плохим, поскольку версия не всегда увеличивается. Третий номер – это количество дней с 2000 года, а четвертое число – это количество секунд с полуночи (разделено на 2). [ЭТО НЕ СЛУЧАЙНО]. Поэтому, если вы построили решение в конце дня один день, а на следующий день на следующий день более поздняя версия будет иметь более раннюю версию. Я рекомендую всегда использовать XY* вместо XYZ* потому что ваш номер версии ВСЕГДА увеличится.

Вы можете использовать механизм шаблонов T4 в Visual Studio для генерации требуемого исходного кода из простого текстового файла :

Я хотел настроить генерацию информации о версии для некоторых проектов .NET. Прошло много времени с тех пор, как я исследовал доступные варианты, поэтому я искал, надеясь найти простой способ сделать это. То, что я нашел, не выглядело очень обнадеживающим: люди пишут надстройки Visual Studio и пользовательские задачи MsBuild, чтобы получить одно целое число (хорошо, может быть, два). Это казалось излишним для небольшого личного проекта.

Вдохновение пришло из одной из дискуссий StackOverflow, где кто-то предложил, чтобы T4-шаблоны могли выполнять эту работу. И, конечно, они могут. Решение требует минимальных усилий и не требует настройки Visual Studio или сборки. Вот что нужно сделать:

  1. Создайте файл с расширением «.tt» и поместите там шаблон T4, который будет генерировать атрибуты AssemblyVersion и AssemblyFileVersion:
 <#@ 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; #> 

Вам нужно будет решить алгоритм генерации номера версии. Для меня было достаточно автоматического генерировать номер ревизии, который установлен на количество дней с 1 января 2010 года. Как вы можете видеть, правило генерации версии написано на простом 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")] 

Да, сегодня это 113 дней с 1 января 2010 года. Завтра номер редакции изменится.

  1. Следующий шаг – удалить атрибуты AssemblyVersion и AssemblyFileVersion из файлов AssemblyInfo.cs во всех проектах, которые должны совместно использовать одну и ту же автоматическую версию информации о версии. Вместо этого выберите «Добавить существующий элемент» для каждого проекта, перейдите в папку с файлом шаблона T4, выберите соответствующий «.cs» файл и добавьте его в качестве ссылки. Что будет делать!

Что мне нравится в этом подходе, так это то, что оно легкое (без пользовательских задач MsBuild), а автоматически генерируемая информация о версии не добавляется в исходный контроль. И, конечно, использование алгоритма генерации версии C # для алгоритмов любой сложности.

Это моя реализация предложения T4 … Это будет увеличивать номер сборки каждый раз, когда вы создадите проект независимо от выбранной конфигурации (например, Debug | Release), и каждый раз, когда вы создаете сборку Release, он будет увеличивать номер версии. Вы можете продолжить обновление основных и младших номеров версий с помощью приложения ➤ Информация о сборке …

Для более подробного объяснения это будет читать существующий файл AssemblyInfo.cs и использовать регулярное выражение для поиска информации AssemblyVersion а затем увеличивать число версий и строить на основе ввода из TextTransform.exe .

  1. Удалите существующий файл AssemblyInfo.cs .
  2. Создайте файл AssemblyInfo.tt на своем месте. Visual Studio должен создать AssemblyInfo.cs и сгруппировать его с T4-файлом после сохранения файла 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\\(\"(?\\d+)\\.(?\\d+)\\.(?\\d+)\\.(?\\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" 

Если вы помещаете звездочку для сборки и ревизии, визуальная студия использует количество дней с 1 января 2000 года в качестве номера сборки и количество секунд с полуночи, разделенное на 2 как ревизия.

МНОГО БОЛЬШЕ РЕШЕНИЯ ДЛЯ СВОБОДНЫХ РЕСУРСОВ – http://autobuildversion.codeplex.com/

Он работает как шарм, и он ОЧЕНЬ гибкий.

Вот цитата из AssemblyInfo.cs из MSDN :

Вы можете указать все значения или вы можете принять номер сборки по умолчанию, номер версии или оба с помощью звездочки ( ). Например, [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 или в элементе управления, вы можете добавить в тег следующее:

 CompilerOptions="\App_Code\AssemblyInfo.cs" 

(конечно, заменив путь к папке соответствующей переменной).

Я не считаю, что вам нужно добавлять параметры компилятора любым способом для других classов; все те, что в App_Code должны получать информацию о версии при компиляции.

Надеюсь, это поможет.

  • Звезда в версии (например, «2.10.3. *») – это просто, но цифры слишком велики

  • AutoBuildVersion – отлично смотрится, но его не работает на моем VS2010.

  • @ Сценарий DrewChapin работает, но я не могу в своей студии устанавливать разные режимы для события предварительной сборки Debug и события Pre-build Release.

поэтому я немного изменил скрипт … commamd:

 "%CommonProgramFiles(x86)%\microsoft shared\TextTemplating\10.0\TextTransform.exe" -a !!$(ConfigurationName)!1 "$(ProjectDir)Properties\AssemblyInfo.tt" 

и скрипт (это работает с конфигурациями «Debug» и «Release»):

 <#@ template debug="true" hostspecific="true" language="C#" #> <#@ output extension=".cs" #> <#@ assembly name="System.Windows.Forms" #> <#@ import namespace="System.IO" #> <#@ import namespace="System.Text.RegularExpressions" #> <# int incRevision = 1; int incBuild = 1; try { incRevision = Convert.ToInt32(this.Host.ResolveParameterValue("","","Debug"));} catch( Exception ) { incBuild=0; } try { incBuild = Convert.ToInt32(this.Host.ResolveParameterValue("","","Release")); } catch( Exception ) { incRevision=0; } try { string currentDirectory = Path.GetDirectoryName(Host.TemplateFile); string assemblyInfo = File.ReadAllText(Path.Combine(currentDirectory,"AssemblyInfo.cs")); Regex pattern = new Regex("AssemblyVersion\\(\"\\d+\\.\\d+\\.(?\\d+)\\.(?\\d+)\"\\)"); MatchCollection matches = pattern.Matches(assemblyInfo); revision = Convert.ToInt32(matches[0].Groups["revision"].Value) + incRevision; build = Convert.ToInt32(matches[0].Groups["build"].Value) + incBuild; } catch( Exception ) { } #> using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("Game engine. Keys: F2 (Debug trace), F4 (Fullscreen), Shift+Arrows (Move view). ")] [assembly: AssemblyProduct("Game engine")] [assembly: AssemblyDescription("My engine for game")] [assembly: AssemblyCompany("")] [assembly: AssemblyCopyright("Copyright © Name 2013")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. Only Windows // assemblies support COM. [assembly: ComVisible(false)] // On Windows, the following GUID is for the ID of the typelib if this // project is exposed to COM. On other platforms, it unique identifies the // title storage container when deploying this assembly to the device. [assembly: Guid("00000000-0000-0000-0000-000000000000")] // Version information for an assembly consists of the following four values: // // Major Version // Minor Version // Build Number // Revision // [assembly: AssemblyVersion("0.1.<#= this.revision #>.<#= this.build #>")] [assembly: AssemblyFileVersion("0.1.<#= this.revision #>.<#= this.build #>")] <#+ int revision = 0; int build = 0; #> 

Вы можете попробовать использовать UpdateVersion Мэттом Гриффитом . Сейчас он довольно старый, но работает хорошо. Чтобы использовать его, вам просто нужно настроить событие предварительной сборки, которое указывает на файл AssemblyInfo.cs, и приложение будет соответствующим образом обновлять номера версий в соответствии с аргументами командной строки.

Поскольку приложение является открытым исходным кодом, я также создал версию, чтобы увеличить номер версии, используя формат (основная версия). (Малая версия). ([Year] [dayofyear]). (Increment) . Более подробную информацию об этом и обновленном коде можно найти в моей записи в блоге, в версиях версий Assembly и .NET .

Обновление: я поместил код для моей модифицированной версии приложения UpdateVersion в GitHub: https://github.com/munr/UpdateVersion

Вы можете выполнить более расширенное управление версиями, используя скрипты сборки, такие как Build Versioning

Давайте будем гением компьютера.