Comment puis-je obtenir la version de l'assembly en cours d'exécution?

169

J'essaie d'obtenir la version de l'assembly en cours d'exécution en C # 3.0 en utilisant le code suivant:

var assemblyFullName = Assembly.GetExecutingAssembly().FullName;
var version = assemblyFullName .Split(',')[1].Split('=')[1];

Y a-t-il une autre manière appropriée de le faire?

utilisateur1
la source

Réponses:

293

Deux options ... quel que soit le type d'application, vous pouvez toujours appeler:

Assembly.GetExecutingAssembly().GetName().Version

S'il s'agit d'une application Windows Forms , vous pouvez toujours accéder via l'application si vous recherchez spécifiquement la version du produit.

Application.ProductVersion

L'utilisation GetExecutingAssemblypour une référence d'assemblage n'est pas toujours une option. En tant que tel, je trouve personnellement utile de créer une classe d'assistance statique dans les projets où je peux avoir besoin de référencer l'assembly ou la version d'assembly sous-jacent:

// A sample assembly reference class that would exist in the `Core` project.
public static class CoreAssembly
{
    public static readonly Assembly Reference = typeof(CoreAssembly).Assembly;
    public static readonly Version Version = Reference.GetName().Version;
}

Ensuite, je peux référencer proprement CoreAssembly.Versiondans mon code si nécessaire.

Chris Baxter
la source
7
S'il est déployé avec ClickOnce, vous devez vérifierSystem.Deployment.Application.ApplicationDeployment.CurrentDeployment.CurrentVersion
Justin Morgan le
Ce qui serait intéressant: où avez-vous besoin de spécifier la version réelle? J'ai spécifié AssemblyVersion et AssemblyFileVersion dans mon AssemblyInfo.cs et tout ce que je reçois de l'appel de méthode ci-dessus est: 0.0.0.0 malgré avoir spécifié 1.0.0
AgentKnopf
@Zainodis Si vous faites référence à la ClickOnceversion mentionnée par @Justin, elle est spécifiée dans l' Publishonglet dans les propriétés du projet (c'est-à-dire sans rapport avec AssemblyVersion ou AssemblyFileVersion).
Chris Baxter
@CalgaryCoder merci pour la réponse, je ne sais pas ce qu'est ClickOnce, mais il s'est avéré que lors de l'édition du fichier AssemblyInfo via VS, cela a soudainement fonctionné oO. La modification manuelle de AssemblyInfo.cas dans un éditeur de texte a rendu tous les champs vides. Quoi qu'il en soit, c'est résolu maintenant :)
AgentKnopf
7
Il convient de mentionner que cela ne fonctionne pas dans les applications ASP.NET MVC, en raison du contexte de lancement. Une solution de contournement consiste à référencer un type connu dans l'assemblage de votre site Web, par exemple l'omniprésent MVC HomeController, donc dans Razor:v@(Assembly.GetAssembly(typeof(MyWebProject.Mvc.Controllers.HomeController)).GetName().Version.ToString(2))
James McCormack
38

Dans MSDN, la méthode Assembly.GetExecutingAssembly , est une remarque sur la méthode "getexecutingassembly", qui pour des raisons de performances, vous devez appeler cette méthode uniquement lorsque vous ne savez pas au moment du design quel assembly est en cours d'exécution.

La méthode recommandée pour récupérer un objet Assembly qui représente l'assembly actuel consiste à utiliser la Type.Assemblypropriété d'un type trouvé dans l'assembly.

L'exemple suivant illustre:

using System;
using System.Reflection;

public class Example
{
    public static void Main()
    {
        Console.WriteLine("The version of the currently executing assembly is: {0}",
                          typeof(Example).Assembly.GetName().Version);
    }
}

/* This example produces output similar to the following:
   The version of the currently executing assembly is: 1.1.0.0

Bien sûr, c'est très similaire à la réponse avec la classe d'assistance "classe statique publique CoreAssembly", mais, si vous connaissez au moins un type d'assembly en cours d'exécution, il n'est pas obligatoire de créer une classe d'assistance, et cela vous fait gagner du temps.

Sharunas Bielskis
la source
19
using System.Reflection;
{
    string version = Assembly.GetEntryAssembly().GetName().Version.ToString();
}

Remarques de MSDN http://msdn.microsoft.com/en-us/library/system.reflection.assembly.getentryassembly%28v=vs.110%29.aspx :

La GetEntryAssemblyméthode peut être renvoyée nulllorsqu'un assembly géré a été chargé à partir d'une application non gérée. Par exemple, si une application non gérée crée une instance d'un composant COM écrit en C #, un appel à la GetEntryAssemblyméthode à partir du composant C # retourne null, car le point d'entrée du processus était du code non managé plutôt qu'un assembly managé.

Hammad Qureshi
la source
2
+1. GetEntryAssembly(vs GetCallingAssemblyou GetExecutingAssembly) semble être la seule chose qui fonctionne lorsqu'il est appelé depuis une bibliothèque de référence.
drzaus
6

Cela devrait faire:

Assembly assem = Assembly.GetExecutingAssembly();
AssemblyName aName = assem.GetName();
return aName.Version.ToString();
Elroy Flynn
la source
5
ces 3 lignes pourraient devenir 1: return Assembly.GetExecutingAssembly (). GetName (). Version.ToString (); .............
Alexandre
1

Product Version peut être préférable si vous utilisez le contrôle de version via GitVersion ou un autre logiciel de contrôle de version.

Pour obtenir ceci depuis votre bibliothèque de cours, vous pouvez appeler System.Diagnostics.FileVersionInfo.ProductVersion:

using System.Diagnostics;
using System.Reflection;

//...

var assemblyLocation = Assembly.GetExecutingAssembly().Location;
var productVersion = FileVersionInfo.GetVersionInfo(assemblyLocation).ProductVersion

entrez la description de l'image ici

Daniel
la source