Могу ли я автоматически увеличивать версию сборки файла при использовании Visual Studio?

StackOverflow https://stackoverflow.com/questions/356543

Вопрос

Мне просто было интересно, как я мог автоматически увеличьте сборку (и версию?) моих файлов с помощью 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)

Это было полезно?

Решение

В Visual Studio 2008 работает следующее.

Найдите файл AssemblyInfo.cs и найдите эти 2 строки:

[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

Другие советы

откройте файл 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 и сделайте это вручную.

Другим вариантом изменения номеров версий в каждой сборке является использование Версия задача по MSBuild.Сообщество.Задачи.Просто скачайте их установщик, установите его, затем адаптируйте следующий код и вставьте его после <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> в вашем .csproj файл:

<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>

Примечание: Адаптируйте свойство StartDate к вашему региону. В настоящее время он не использует инвариантную культуру.

Для третьей сборки 14 января 2010 года это создает VersionInfo.cs с таким содержанием:

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

Затем этот файл должен быть добавлен в проект (через Добавить существующий элемент), и в AssemblyVersion и AssemblyFileVersion линии должны быть удалены из AssemblyInfo.cs.

Различные алгоритмы изменения компонентов версии описаны в $(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.chm и Свойства версии.

Я придумал решение, похожее на Christians, но независимо от задач MSBuild сообщества, это не вариант для меня, поскольку я не хочу устанавливать эти задачи для всех наших разработчиков.

Я генерирую код и компилирую в Сборку и хочу автоматически увеличивать номера версий.Однако я не могу использовать трюк VS 6.0. * AssemblyVersion, поскольку он автоматически увеличивает номера сборок каждый день и нарушает совместимость со сборками, использующими более старый номер сборки.Вместо этого я хочу иметь жестко запрограммированную AssemblyVersion, но автоматически увеличивающуюся AssemblyFileVersion .Я добился этого, указав AssemblyVersion в AssemblyInfo.cs и сгенерировав VersionInfo.cs в MSBuild следующим образом,

  <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 с атрибутом Assembly для AssemblyFileVersion, где версия соответствует схеме YY.MM.DD.TTTT с датой сборки.Вы должны включить этот файл в свой проект и выполнить сборку с его помощью.

Установите Увеличение версии сборки надстройка.Это дает вам гораздо больше контроля, чем опция *.

Чтобы получить номера версий, попробуйте

 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.*")]

Также в качестве дополнительного примечания, третье число - это количество дней, прошедших с 2/1/2000, а четвертое число - половина общего количества секунд в сутках.Так что, если вы скомпилируете в полночь, она должна быть равна нулю.

Существует расширение Visual Studio Автоматические версии который поддерживает Visual Studio 2012, 2013, 2015 и 2017.

Снимки экрана enter image description here

enter image description here

Установка * в номере версии в AssemblyInfo или в разделе свойства проекта, как описано в других сообщениях, работает не со всеми версиями Visual Studio / .NET.

Afaik это не сработало в VS 2005 (но в VS 2003 и VS 2008).Для VS 2005 вы могли бы использовать следующее: Автоматическое увеличение сборки версии Visual Studio 2005 и номера редакции во время компиляции.

Но имейте в виду, что автоматическое изменение номера версии не рекомендуется для сборок со строгими именами.Причина в том, что все ссылки на такую сборку должны обновляться каждый раз, когда указанная сборка перестраивается из-за того факта, что ссылки на сборки со строгими именами всегда являются ссылкой на конкретную версию сборки.Сами корпорации Майкрософт меняют номер версии сборок .NET Framework только в том случае, если происходят изменения в интерфейсах.(ПРИМЕЧАНИЕ:Я все еще ищу ссылку в MSDN, где я это прочитал.)

Чтобы получить информацию об увеличении (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 (подпапка Properties) в свой проект

Код для возврата даты (годы с точностью до секунд):

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.0.*", и он автоматически заполнит последние два числа датой (в днях с определенного момента) и временем (половина секунды с полуночи).

Это находится в свойствах вашего проекта в разделе Опубликовать

http://screencast.com/t/Vj7rhqJO
(~ http://screencast.com/t/Vj7rhqJO)

Торт поддерживает исправление файлов 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 - это версия файла сборки.

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

Перейдите в Project | Properties, затем в Assembly Information, затем в Assembly Version и поставьте * в последнем или предпоследнем поле (вы не можете автоматически увеличивать основные или второстепенные компоненты).

Используйте задачу AssemblyInfo из задач сообщества MSBuild (http://msbuildtasks.tigris.org/) проект и интегрируйте его в ваш файл .csproj/.vbproj.

В нем есть несколько опций, в том числе одна для привязки номера версии к дате и времени суток.

Рекомендуемые.

На данный момент, для моего приложения,

string ver = Application.ProductVersion;

ВОЗВРАТ ver = 1.0.3251.27860

Значение 3251 - это количество дней, прошедших с 1/1/2000.Я использую его, чтобы поместить дату создания версии на заставку моего приложения.Когда я имею дело с пользователем, я могу спросить дату создания, которую легче сообщить, чем какое-то длинное число.

(Я работаю в отделе из одного человека, поддерживающем небольшую компанию.Этот подход может не сработать для вас.)

Изменение AssemblyInfo работает в VS2012.Кажется странным, что в Visual Studio больше нет поддержки для этого, можно подумать, что это базовая часть процесса сборки / выпуска.

Как получить версию {major}.{year}.1{date}.1{time}

Этот вариант в некотором роде экспериментальный, но мне он нравится.Вдохновлен Джеффом Этвудом @ CodingHorror (Ссылка).

Результирующий номер версии становится 1.2016.10709.11641 (имеется в виду 2016-07-09 16:41), который позволяет

  • нулевое заполнение бедняги (с глупым ведущим 1s)
  • почти читаемый человеком Местные новости Дата-время, встроенное в номер версии
  • оставляя основную версию в покое для действительно серьезных изменений.

Добавьте новый элемент в свой проект, выберите Общие -> Текстовый шаблон, назовите его примерно так CustomVersionNumber и (там, где это применимо) прокомментируйте AssemblyVersion и AssemblyFileVersion в Properties/AssemblyInfo.cs.

Затем, при сохранении этого файла или создании проекта, это приведет к регенерации .cs файл, расположенный в качестве подпункта под созданным .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}" #>")]

Возможно, для этой задачи вы можете использовать такой код, как этот:

    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 (но вы должны использовать "стандартную" структуру каталогов).

AssemblyInfoUtil Сборка.Бесплатно.С открытым исходным кодом.

Я использую этот подход https://stackoverflow.com/a/827209/3975786 поместив шаблон T4 в раздел "Элементы решения" и используя его с надписью "Добавить как ссылку" в каждом проекте.

Возможно, уже слишком поздно отвечать здесь, но надеюсь, что это решит чью-то беспокойную проблему.

Автоматический способ изменить версию сборки всех ваших проектов с помощью сценария PowerShell. Эта статья решит многие ваши проблемы.

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

Я понятия не имею, как обновить остальные, но вы, по крайней мере, уже должны это видеть...

Я создал приложение для автоматического увеличения версии файла.

  1. Скачать Применение
  2. добавьте следующую строку в командную строку события предварительной сборки

    C: emp\IncrementFileVersion.exe $(SolutionDir)\Свойства\AssemblyInfo.cs

  3. Создайте проект

Чтобы упростить задачу, приложение выдает сообщения только в случае ошибки, чтобы подтвердить, что оно работает нормально, вам нужно будет проверить версию файла в разделе "Информация о сборке"

Примечание :Вам придется перезагрузить решение в Visual Studio с помощью кнопки "Сведения о сборке", чтобы заполнить поля, однако ваш выходной файл будет иметь обновленную версию.

Для предложений и просьб, пожалуйста, пишите мне по адресу telson_alva@yahoo.com

В Visual Studio 2019

Мне было недостаточно добавить

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

При сборке он выдает мне эту ошибку

Указанная строка версии не соответствует требуемому формату

Решение

Формат был окончательно принят после того, как я установил Deterministic Для False в project.csproj

<Deterministic>false</Deterministic>

Редактировать:

По какой-то причине установка Deterministic Для False испортил мой конфигурационный файл, загрузив его и сохранив в разных местах.

Обходной путь:

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

Пакетный сценарий события после сборки

Это вызывает сценарий powershell с именем autoincrement_version.ps1 передавая в качестве аргумента путь к AssemblyInfo.cs

if $(ConfigurationName) == Release (
PowerShell -ExecutionPolicy RemoteSigned $(ProjectDir)autoincrement_version.ps1 '$(ProjectDir)My Project\AssemblyInfo.cs'
)

Скрипт Poweshell

Он автоматически увеличивает номер редакции с помощью регулярного выражения

param( [string]$file );
  $regex_revision = '(?<=Version\("(?:\d+\.)+)(\d+)(?="\))'
  $found = (Get-Content $file) | Select-String -Pattern $regex_revision
  $revision = $found.matches[0].value
  $new_revision = [int]$revision + 1
  (Get-Content $file) -replace $regex_revision, $new_revision | Set-Content $file -Encoding UTF8
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top