830 votes

Comment puis-je obtenir la version du fichier d'assemblage

Sur AssemblyInfo il existe deux versions d'assemblage :

  1. AssemblyVersion : Indiquez la version de l'assemblage en cours d'attribution.
  2. AssemblyFileVersion : Indique au compilateur d'utiliser un numéro de version spécifique pour la ressource de la version du fichier Win32. Il n'est pas nécessaire que la version du fichier Win32 soit la même que le numéro de version de l'assemblage.

Je peux obtenir le Assembly Version avec la ligne de code suivante :

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

Mais comment puis-je obtenir le Assembly File Version ?

2 votes

Que voulez-vous dire par "version du fichier d'assemblage" par opposition à "version de l'assemblage" ? Pouvez-vous donner un exemple ?

9 votes

@Xiaofu -- "Assembly Version" est ce que .NET utilise en interne. La "Version du fichier d'assemblage" est ce qui apparaît lorsque vous cliquez avec le bouton droit de la souris sur un fichier et que vous allez dans "Propriétés" puis dans l'onglet "Détails". Ce n'est pas la même chose.

0 votes

J'ai découvert que la version de l'assemblage est utilisée pour déterminer l'emplacement du fichier user.config dans AppData.

959voto

Xiaofu Points 6163

Voir mon commentaire ci-dessus demandant une clarification 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;

5 votes

@Xiaofu : Y a-t-il un moyen d'obtenir les numéros de version à partir d'un fichier AssemblyInfo.cs à la place ?

64 votes

Un problème avec ce code est qu'il retournera 1.0.*.* si vous n'avez pas spécifié les numéros de build et de révision. AssemblyName.GetAssemblyName(assembly.Location).Version.ToString() ; vous obtiendra 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.

0 votes

Sympa, mais je préfère de loin utiliser les propriétés FileMajorPart / FileMinorPart / FileBuildPart / FilePrivatePart pour obtenir les nombres entiers plutôt que la chaîne préformatée FileVersion. Personne n'aime voir le genre de chose "1.9.0.0" dans la barre de titre d'un programme.

268voto

Check6 Points 199

Il y a trois versions : montage , fichier y produit . Ils sont utilisés par différentes fonctionnalités et prennent des valeurs par défaut différentes 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;

17 votes

Pour le cas où cet article de blog disparaîtrait un jour, le voici résumé pour 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).FileVer‌​sion; string productVersion = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly‌​().Location).Product‌​Version;

3 votes

Et pour ceux qui veulent les spécifier dans le fichier AssemblyInfo.cs, pour l'utilisation de assemblyVersion (avec les chiffres 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 un suffixe de chaîne pour SemVer compatibilité : [assembly: AssemblyInformationalVersion("2.0.0-alpha")]

0 votes

Adenda: AssemblyFileVersion ne peut pas utiliser le * notation du suffixe. :( Il faut les quatre chiffres. [assembly: AssemblyFileVersion("2.0.0.1")]

86voto

syntap Points 131

Lorsque je veux accéder à la version du fichier de l'application (ce qui est défini dans Informations sur l'assemblage -> Version du fichier), par exemple pour y associer le texte d'une étiquette au chargement du formulaire afin d'afficher la version, je viens d'utiliser les éléments suivants

versionlabel.Text = "Version " + Application.ProductVersion;

Cette approche nécessite une référence à System.Windows.Forms .

64 votes

Notez que cela nécessite une référence à System.Windows.Forms, et peut donc ne pas convenir à toutes les applications.

3 votes

Malheureusement, c'est une chaîne. Ce n'est pas idéal si vous voulez la formater vous-même dans un format plus simple du type "v1.08". Beaucoup plus pratique si vous obtenez l'objet version pour obtenir les sous-composants sous forme d'entiers.

1 votes

De plus, cette fonction récupère AssemblyFileVersion à partir de AssemblyInfo, et non AssemblyVersion, alors faites attention.

28voto

Ruben Bartelink Points 23945

UPDATE : Comme mentionné par Richard Grimes dans mon poste cité @Iain et @Dmitry Lobanov, ma réponse est juste en théorie mais fausse en pratique.

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

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


~~public static string GetProductVersion() { var attribute = (AssemblyVersionAttribute)Assembly .GetExecutingAssembly() .GetCustomAttributes( typeof(AssemblyVersionAttribute), true ) .Single(); return attribute.InformationalVersion; }~~

(De http://bytes.com/groups/net/420417-assemblyversionattribute - comme indiqué ici, si vous cherchez un autre attribut, remplacez-le dans le texte ci-dessus)

0 votes

Hey Ruben, 2 notes. Premièrement, la question demandait 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é.

0 votes

En ce qui concerne le premier point, c'est pourquoi j'ai dit "si vous cherchez un attribut différent, substituez-le dans ce qui précède" (IIRC je n'ai pas essayé). Pour le deuxième point, cela semble plausible mais je n'ai pas le temps de creuser...

0 votes

Oui, en fait, vous ne pouvez pas obtenir l'attribut AssemblyVersion via .GetCustomAttribute(), la version de l'assemblage peut être récupérée via AssemblyName.Version propriété uniquement. Mais pour tous les autres attributs, c'est la bonne façon de faire.

12voto

Clark Kent Points 5845

Utilisez cette

 static public class ApplicationInfo
    {
        public static Version Version { get { return Assembly.GetCallingAssembly().GetName().Version; } }

        public static string Title
        {
            get
            {
                object[] attributes = Assembly.GetCallingAssembly().GetCustomAttributes(typeof(AssemblyTitleAttribute), false);
                if (attributes.Length > 0)
                {
                    AssemblyTitleAttribute titleAttribute = (AssemblyTitleAttribute)attributes[0];
                    if (titleAttribute.Title.Length > 0) return titleAttribute.Title;
                }
                return System.IO.Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().CodeBase);
            }
        }

        public static string ProductName
        {
            get
            {
                object[] attributes = Assembly.GetCallingAssembly().GetCustomAttributes(typeof(AssemblyProductAttribute), false);
                return attributes.Length == 0 ? "" : ((AssemblyProductAttribute)attributes[0]).Product;
            }
        }

        public static string Description
        {
            get
            {
                object[] attributes = Assembly.GetCallingAssembly().GetCustomAttributes(typeof(AssemblyDescriptionAttribute), false);
                return attributes.Length == 0 ? "" : ((AssemblyDescriptionAttribute)attributes[0]).Description;
            }
        }

        public static string CopyrightHolder
        {
            get
            {
                object[] attributes = Assembly.GetCallingAssembly().GetCustomAttributes(typeof(AssemblyCopyrightAttribute), false);
                return attributes.Length == 0 ? "" : ((AssemblyCopyrightAttribute)attributes[0]).Copyright;
            }
        }

        public static string CompanyName
        {
            get
            {
                object[] attributes = Assembly.GetCallingAssembly().GetCustomAttributes(typeof(AssemblyCompanyAttribute), false);
                return attributes.Length == 0 ? "" : ((AssemblyCompanyAttribute)attributes[0]).Company;
            }
        }

    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X