2009-10-11 8 views
6

Au cours d'un processus de création d'installation, je prévois de faire ce qui suit (dans un C# Script):changer le AssemblyVersion et Programmatically AssemblyFileVersion attributs

  1. Lire les AssemblyVersion et AssemblyFileVersion valeurs d'attribut d'une DLL.
  2. Itérer toutes les DLL et les exécutables du projet et appliquer ces versions à leurs valeurs d'attribut AssemblyVersion et AssemblyFileVersion.

La question est maintenant: Comment faire l'étape 2?

Je peux réussir l'étape 1, mais pour l'étape 2, je ne vois pas de véritable point de départ. Ce que je dois probablement faire est d'utiliser des méthodes P/Invoke natives car les attributs modifient directement les informations de la ressource d'information de version d'une DLL/exécutable.

Des indices à ce sujet?

Merci, Uwe

Répondre

13

Pourquoi ne pas, au cours du processus de construction, lisez la AssemblyVersion et AssemblyFileVersion d'une DLL et enregistrez-le revenir à d'autres AssemblyInfo.cs de csproject, alors seulement le compiler?

En fait, je ne sais pas s'il est possible de modifier le fichier DLL directement, sans avoir recours à quelque chose de fantaisiste.

Ou bien, assurez-vous que toutes vos DLL partagent un commun AssemblyInfo.cs. Vous pouvez le faire en ajoutant le AssemblyInfo.cs en tant que "Ajouter en tant que lien" lorsque vous ajoutez un nouvel élément dans csproject. De cette façon, lorsque vous faites une compilation, toutes les DLL partageront le même AssemblyInfo.cs, et sortiront donc le même AssemblyVersion.

+1

oui, ce serait beaucoup plus ** ** plus facile! Définissez les numéros de version directement au moment de la construction, par ex. en utilisant un serveur de construction d'intégration continue –

+1

Ce serait la bonne façon, en changeant les fichiers compilés casser la ligne d'information propre entre le code et les binaires. –

+0

Merci beaucoup, j'aime bien l'idée de partager le fichier AssemblyInfo.cs! –

1

Si vous avez accès aux sources, prendre la advice from Graviton

Si vous n'êtes pas, vous pourriez être en difficulté. Vous pouvez peut-être désassembler avec ILDASM et réassembler avec ILASM. Mais cela ne fonctionnera pas pour les assemblées avec des noms forts.

2

Dans mon cas, j'ai créé un modèle T4 pour modifier AssemblyVersion et AssemblyFileVersion. J'ai appelé le modèle Assembly.tt et lui ai fait un fichier lié (lorsque vous l'ajoutez, choisissez Ajouter un lien, au lieu de Ajouter). Tous mes assemblages tirent dans le fichier Assembly.tt lié.

Vous pouvez ensuite exécuter le modèle T4 à partir d'un emplacement et mettre à jour toutes les valeurs AssemblyVersion et AssemblyFileVersions. Vous n'avez pas besoin d'appeler le fichier AssemblyInfo.cs pour que les informations soient tirées dans vos DLL.

Le code pour le fichier Assembly.tt est:

<#@ 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; 
#> 

La sortie du modèle T4 ci-dessus sera:

// 
// 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")] 
Questions connexes