Программно изменить атрибуты AssemblyVersion и AssemblyFileVersion - PullRequest
7 голосов
/ 11 октября 2009

В процессе создания установки я планирую сделать следующее (в сценарии C # ):

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

Вопрос теперь: Как выполнить шаг 2?

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

Есть намеки на это?

Ответы [ 3 ]

13 голосов
/ 11 октября 2009

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

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

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

2 голосов
/ 11 октября 2016

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

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

Код для файла 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")]
1 голос
/ 11 октября 2009

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

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

...