2009-10-11 5 views
6

Во время процесса создания установки, я планирую сделать следующее (в C# Script):Программным изменить AssemblyVersion и AssemblyFileVersion атрибуты

  1. Считать значения AssemblyVersion и AssemblyFileVersion атрибутов одной DLL.
  2. Исключите все DLL и исполняемые файлы в проекте и примените их к их значениям AssemblyVersion и AssemblyFileVersion.

Вопрос сейчас: Как это сделать Шаг 2?

Я успешно могу сделать шаг 1, но для шага 2 я не вижу реальной начальной точки. Я, вероятно, должен использовать некоторые собственные методы P/Invoke, поскольку атрибуты напрямую изменяют информацию о ресурсах информации о версии DLL/исполняемого файла.

Любые намеки на это?

Спасибо, Uwe

ответ

13

Почему не вы, в процессе сборки, читать AssemblyVersion и AssemblyFileVersion одной DLL, и сохранить его обратно в других csproject-х AssemblyInfo.cs, только потом скомпилировать его?

На самом деле, я не знаю, можно ли напрямую изменить файл DLL, не прибегая к чему-то причудливому.

Или, альтернативно, убедитесь, что все ваши DLL-файлы имеют один общий AssemblyInfo.cs. Вы можете сделать это, добавив AssemblyInfo.cs как «Добавить как ссылку», когда вы добавляете новый элемент в csproject. Таким образом, когда вы делаете компиляцию, все библиотеки DLL будут совместно использовать один и тот же AssemblyInfo.cs, и, таким образом, вывести то же самое AssemblyVersion.

+1

да, это было бы гораздо ** ** проще! Установите номера версий прямо во время сборки, например. используя сервер построения непрерывной интеграции –

+1

Это будет правильный путь, изменение скомпилированных файлов прерывает чистую информационную строку между кодом и двоичными файлами. –

+0

Большое спасибо, мне нравится идея совместного использования файла AssemblyInfo.cs! –

1

Если у вас есть доступ к источникам, возьмите advice from Graviton

Если вы этого не сделаете, вы можете быть в беде. Возможно, вы можете разобраться с ILDASM и собрать с помощью ILASM. Но это не сработает для сильно названных сборок.

2

В моем случае я создал шаблон T4 для изменения AssemblyVersion и AssemblyFileVersion. Я вызвал шаблон Assembly.tt и сделал его связанным файлом (когда вы добавляете его, выберите Add Link, а не Add). Все мои сборки втянуты в связанный файл Assembly.tt.

Затем вы можете запустить шаблон T4 из одного места и обновить все AssemblyVersion и AssemblyFileVersions. Вам не нужно вызывать файл AssemblyInfo.cs для информации, которую нужно вставить в ваши DLL.

Код для файла Assembly.tt является:

<#@ template language="C#" hostspecific="true" #> 
// 
// 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("4.<#= this.RevisionYear #>.<#= this.RevisionNumber #>.<#= this.RevisionTime #>")] 
[assembly: AssemblyFileVersion("4.<#= this.RevisionYear #>.<#= this.RevisionNumber #>.<#= this.RevisionTime #>")] 
<#+ 
    int RevisionYear = DateTime.UtcNow.Year; 
    int RevisionNumber = (int)(DateTime.UtcNow - new DateTime(DateTime.UtcNow.Year,1,1)).TotalDays; 
    int RevisionTime = (int)(DateTime.UtcNow - new DateTime(DateTime.UtcNow.Year, DateTime.UtcNow.Month, DateTime.UtcNow.Day)).TotalMinutes; 
#> 

Выход шаблона T4 выше:

// 
// 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("4.2016.284.1066")] 
[assembly: AssemblyFileVersion("4.2016.284.1066")] 
Смежные вопросы