Comment obtenir la version du fichier d'assemblage

727

Il AssemblyInfoexiste deux versions d'assemblage:

  1. AssemblyVersion: Spécifiez la version de l'assemblage en cours d'attribution.
  2. AssemblyFileVersion: Demande à un compilateur d'utiliser un numéro de version spécifique pour la ressource de version de fichier Win32. Il n'est pas nécessaire que la version du fichier Win32 soit identique au numéro de version de l'assembly.

Je peux obtenir le Assembly Versionavec la ligne de code suivante:

Version version = Assembly.GetEntryAssembly().GetName().Version;

Mais comment puis-je l'obtenir Assembly File Version?

Enyra
la source
2
Qu'entendez-vous par «version de fichier d'assembly» par opposition à «version d'assembly»? Pouvez-vous donner un exemple?
Xiaofu
7
@Xiaofu - "Assembly Version" est ce que .NET utilise en interne. "Version du fichier d'assemblage" est ce qui s'affiche lorsque vous cliquez avec le bouton droit sur un fichier et accédez à "Propriétés" puis à l'onglet "Détails". Ils ne sont pas les mêmes.
rory.ap
J'ai constaté que la version de l'assembly est utilisée pour déterminer l'emplacement user.config dans AppData.
Kyle Delaney

Réponses:

867

Voir mon commentaire ci-dessus demandant des éclaircissements sur ce que vous voulez vraiment. J'espère que c'est ça:

System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
System.Diagnostics.FileVersionInfo fvi = System.Diagnostics.FileVersionInfo.GetVersionInfo(assembly.Location);
string version = fvi.FileVersion;
Xiaofu
la source
4
@Xiaofu: Existe-t-il un moyen d'obtenir les numéros de version à partir d'un fichier AssemblyInfo.cs à la place?
Markus
56
Un problème avec ce code est que, en fait, il renverra 1.0. *. * Si vous n'avez pas spécifié de numéros de version et de révision. AssemblyName.GetAssemblyName (assembly.Location) .Version.ToString (); vous obtiendrez le numéro de version «compilé» - qui devrait être le même que FileVersion, si vous définissez les deux versions de la même manière.
Doguhan Uluca
17
@DoguhanUluca Ce sont deux choses différentes. Cela vous donnera la version de l'assembly, pas la version du fichier. "Si vous définissez les deux versions de la même manière" est une solution de contournement, pas une solution.
Nyerguds
1
N'a FileVersionInfoque des stringpropriétés et aucune Versionpropriété?
Kyle Delaney
3
@Yitzchak: Assembly.GetEntryAssembly()retourne NULL par exemple dans le contexte des compléments Office, ainsi que dans de nombreux autres cas. De plus, si vous pensez aux compléments / plugins - EntryAssembly est l'application hôte, et le plus souvent, vous voulez la version de YourCode (TM) :) En dehors de cela, cela vaut la peine d'ajouter à cette réponse que la réponse assembly.Locationutilisée peut également être nulle. (c'est-à-dire le premier cas aléatoire googlé : github.com/Azure/azure-functions-host/issues/1233 ) et cela se produit probablement encore plus souvent que d'avoir un assemblage d'entrée nul.
quetzalcoatl
209

Il existe trois versions : assemblage , fichier et produit . Ils sont utilisés par différentes fonctionnalités et prennent différentes valeurs par défaut si vous ne les spécifiez pas explicitement.

string assemblyVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString(); 
string assemblyVersion = Assembly.LoadFile("your assembly file").GetName().Version.ToString(); 
string fileVersion = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).FileVersion; 
string productVersion = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).ProductVersion;
Check6
la source
17
Pour quand ce billet de blog disparaît un jour, ici, il se résume à titre de référence:string assemblyVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString(); string assemblyVersion = Assembly.LoadFile('your assembly file').GetName().Version.ToString(); string fileVersion = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).FileVersion; string productVersion = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).ProductVersion;
JMD
3
Et pour ceux qui souhaitent les spécifier dans le fichier AssemblyInfo.cs, pour utiliser assemblyVersion (avec les nombres que vous voulez) === [assembly: AssemblyVersion("2.0.*")]pour fileVersion utiliser === [assembly: AssemblyFileVersion("2.0.*")]et pour productVersion utiliser === [assembly: AssemblyInformationalVersion("2.0.*")] Le dernier peut prendre le suffixe de chaîne pour la SemVercompatibilité:[assembly: AssemblyInformationalVersion("2.0.0-alpha")]
Jesse Chisholm
Addendum: AssemblyFileVersionne peut pas utiliser la *notation suffixe. :( Il a besoin des quatre chiffres.[assembly: AssemblyFileVersion("2.0.0.1")]
Jesse Chisholm
66

Lorsque je souhaite accéder à la version du fichier d'application (ce qui est défini dans Informations sur l'assemblage -> Version du fichier), par exemple pour lui attribuer le texte d'une étiquette lors du chargement du formulaire pour afficher la version, je viens d'utiliser

versionlabel.Text = "Version " + Application.ProductVersion;
syntaxe
la source
53
Notez que cela nécessite une référence à System.Windows.Forms et peut donc ne pas convenir à toutes les applications.
BradleyDotNET
2
Malheureusement, c'est une chaîne. Pas idéal si vous souhaitez le formater vous-même dans un format plus simple "v1.08". Beaucoup plus pratique si vous obtenez réellement l'objet version pour obtenir les sous-composants sous forme d'entiers.
Nyerguds
1
En outre, cela récupère AssemblyFileVersion de AssemblyInfo, pas AssemblyVersion, alors
faites
Un utilisateur de haut niveau pourrait-il modifier cette réponse pour qu'il soit plus clair qu'il s'agit uniquement de Windows Forms?
2017
C'est exactement ce que je cherchais, merci pour la réponse!
David Refoua
23

MISE À JOUR: Comme mentionné par Richard Grimes dans mon article cité , @Iain et @Dmitry Lobanov, ma réponse est correcte en théorie mais erronée en pratique.

Comme j'aurais dû m'en souvenir dans d'innombrables livres, etc., alors que l'on définit ces propriétés à l'aide de [assembly: XXXAttribute], elles sont détournées par le compilateur et placées dans la VERSIONINFOressource.

Pour la raison ci-dessus, vous devez utiliser l'approche de la réponse de @ Xiaofu car les attributs sont supprimés après que le signal en a été extrait.


chaîne statique publique GetProductVersion ()
{
  var attribute = (AssemblyVersionAttribute) Assembly
    .GetExecutingAssembly ()
    .GetCustomAttributes (typeof (AssemblyVersionAttribute), true)
    .Célibataire();
   return attribute.InformationalVersion;
}

(À partir de http://bytes.com/groups/net/420417-assemblyversionattribute - comme indiqué ici, si vous recherchez un attribut différent, remplacez-le par celui-ci)

Ruben Bartelink
la source
Hé Ruben, 2 notes. Tout d'abord, la question posée pour AssemblyFileVersion et non AssemblyVersion. Deuxièmement, Assembly.GetExecutingAssembly (). GetCustomAttributes (typeof (AssemblyVersionAttribute), true) renvoie un tableau de longueur 0. Je pense que c'est parce que AssemblyVersionAttribute n'est pas un attribut personnalisé.
Iain
Concernant le premier point, c'est pourquoi j'ai dit "si vous recherchez un attribut différent, remplacez-le par le précédent" (IIRC je ne l'ai pas essayé). Concernant le second, cela semble plausible mais je n'ai pas le temps de creuser ...
Ruben Bartelink
Oui, vous ne pouvez pas réellement obtenir l'attribut AssemblyVersion via .GetCustomAttribute (), la version de l'assembly peut être récupérée via la AssemblyName.Versionpropriété uniquement. Mais avec tous les autres attributs, c'est la bonne façon de le faire
Dmitrii Lobanov
@DmitryLobanov et Iain Merci pour les invites. J'espère que la modification le couvre suffisamment pour que la réponse mérite d'être conservée au lieu d'être supprimée - faites-le moi savoir!
Ruben Bartelink
1
J'ai utilisé AssemblyInformationalVersionAttributeau lieu de AssemblyVersionAttributesur .net core 3.1
Vasya Milovidov
5

Utilisez ceci:

((AssemblyFileVersionAttribute)Attribute.GetCustomAttribute(
    Assembly.GetExecutingAssembly(), 
    typeof(AssemblyFileVersionAttribute), false)
).Version;

Ou ca:

new Version(System.Windows.Forms.Application.ProductVersion);
Pieter Geerkens
la source