Можно ли автоматически увеличить версию сборки файла при использовании Visual Studio?
Мне просто интересно, как я мог автоматически увеличить сборку (и версию?) моих файлов с помощью Visual Studio (2005).
Если я посмотрю свойства say C:Windowsnotepad.exe вкладка версия дает "версия файла: 5.1.2600.2180". Я хотел бы получить эти классные номера в версии моей dll тоже, а не версии 1.0.0.0, что давайте посмотрим правде в глаза это немного скучно.
Я пробовал несколько вещей, но это, кажется, не из коробки функциональность, или, может быть, я просто искали не в том месте (как обычно).
Я работаю в основном веб-проектами....
Я посмотрел на обоих:
- http://www.codeproject.com/KB/dotnet/Auto_Increment_Version.aspx
- http://www.codeproject.com/KB/dotnet/build_versioning.aspx
и я не мог поверить, что так много усилий, чтобы сделать что-то это стандартная практика.
изменить:
он не работает в VS2005 насколько я могу судить (http://www.codeproject.com/KB/dotnet/AutoIncrementVersion.aspx)
23 ответов:
в 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, перейдя в project - > properties - > assembly information
это, однако, позволит вам только автоматически увеличить версию сборки и даст вам
версия файла сборки: подстановочный знак ( " * " ) не допускается в этом поле
окно сообщения при попытке разместить * в версии файла поле.
Так что просто откройте assemblyinfo.CS и сделать это вручную.
другой вариант для изменения номеров версий в каждой сборке-использовать версия задание MSBuild.Сообщество.Задачи. Просто загрузите их установщик, установите его, затем адаптируйте следующий код и вставьте его после
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />в своем.csprojfile:<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и Свойства.
Я придумал решение, похожее на христиан, но без зависимости от задач сообщества 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-файл с атрибутом сборки для 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, а четвертое число-половина от общего количества секунд в день. Так что если вы компилируете в полночь он должен быть равен нулю.
установка a * в номере версии в AssemblyInfo или в разделе свойства проекта, как описано в других сообщениях, не работает со всеми версиями 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.
но имейте в виду, что автоматическое изменение номера версии не рекомендуется для сборок со строгими именами. Причина заключается в том, что все ссылки на такую сборку должны обновляться каждый раз при перестроении указанной сборки из-за того, что ссылки на сборки со строгими именами всегда являются ссылками на конкретную версию сборки. Сами корпорации Майкрософт изменяют номер версии сборок .NET Framework только при наличии изменений в интерфейсах. (NB: я все еще ищу ссылку в MSDN, где я это прочитал.)
установите номер версии "1.0.* "и он автоматически заполнит последние два числа с датой (в днях от некоторого момента) и временем (половина секунды от полуночи)
чтобы получить информацию о приращении (DateTime) в свойство AssemblyFileVersion, которое имеет преимущество не нарушать никаких зависимостей.
опираясь на решение Boog (не работает для меня, может быть, из-за VS2008?), вы можете использовать комбинацию событий предварительной сборки, генерирующих файл, добавляя этот файл (включая его свойства версии), а затем используя способ считывания этих значений снова. Что есть..
Pre-Build-Event:
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, если обнаружено достаточно большое изменение). Я сделал это однажды довольно успешно.
есть расширение visual studio Автоматические Версии который поддерживает Visual Studio 2012, 2013, 2015 и 2017.
торт поддерживает исправление файлов 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-это файл сборки версия.
обратите внимание, что вы можете исправлять не только версии, но и также вся другая необходимая информация.
перейдите в проект / свойства, а затем информацию о сборке, а затем версию сборки и поместите * в последнее или предпоследнее поле (вы не можете автоматически увеличивать Основные или второстепенные компоненты).
используйте задачу 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)- почти-удобочитаемое local DateTime встроен в версию номер
- оставляя основную версию в покое для действительно серьезных изменений.
добавьте новый элемент в свой проект, выберите Общие - > текстовый шаблон, назовите его чем-то вроде
CustomVersionNumberи (где применимо) прокомментируйтеAssemblyVersionиAssemblyFileVersionнаProperties/AssemblyInfo.cs.затем, при сохранении этого файла или создании проекта, это будет регенерировать
.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}" #>")]
возможно, для этой задачи можно использовать такой код:
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. в этой статье решит многие из ваших проблем.
каждый раз, когда я делаю сборку, он автоматически увеличивает наименее значимую цифру.
Я понятия не имею, как обновить другим, но вы должны по крайней мере видеть, что уже...
Я создал приложение для автоматического увеличения версии файла.
- скачать приложение
добавьте следующую строку в командную строку события предварительной сборки
C:\temp\IncrementFileVersion.exe $(SolutionDir)\Properties\AssemblyInfo.cs
построить проект
чтобы сохранить его простым приложение только бросает сообщения, если есть ошибка, чтобы подтвердить его работу отлично вам нужно будет проверить версию файла в 'Assembly Information'
Примечание: вам придется перезагрузить решение в Visual studio для кнопки "сведения о сборке", чтобы заполнить поля, однако ваш выходной файл будет иметь обновленную версию.
для предложений и запросов, пожалуйста, напишите Мне по адресу [email protected]



Comments