Come posso ottenere la versione dell'assembly in esecuzione?


169

Sto cercando di ottenere la versione dell'assembly in esecuzione in C # 3.0 utilizzando il seguente codice:

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

C'è un altro modo corretto di farlo?

Risposte:


293

Due opzioni ... indipendentemente dal tipo di applicazione che puoi sempre invocare:

Assembly.GetExecutingAssembly().GetName().Version

Se un'applicazione Windows Form , puoi sempre accedere tramite l'applicazione se cerchi specificamente la versione del prodotto.

Application.ProductVersion

L'uso GetExecutingAssemblyper un riferimento di assieme non è sempre un'opzione. Pertanto, trovo personalmente utile creare una classe di supporto statica in progetti in cui potrebbe essere necessario fare riferimento all'assembly o alla versione dell'assembly sottostante:

// 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;
}

Quindi posso fare chiarezza CoreAssembly.Versionnel mio codice come richiesto.


7
Se è distribuito con ClickOnce, è necessario controllareSystem.Deployment.Application.ApplicationDeployment.CurrentDeployment.CurrentVersion
Justin Morgan,

Cosa sarebbe interessante: dove è necessario specificare la versione attuale? Ho specificato AssemblyVersion e AssemblyFileVersion nel mio AssemblyInfo.cs e tutto ciò che ottengo dalla chiamata precedente è: 0.0.0.0 nonostante abbia specificato 1.0.0
AgentKnopf

@Zainodis Se ti riferisci alla ClickOnceversione menzionata da @Justin, è specificata nella Publishscheda all'interno delle proprietà del progetto (cioè non correlata a AssemblyVersion o AssemblyFileVersion).
Chris Baxter,

@CalgaryCoder grazie per la risposta, non so cosa sia ClickOnce, ma si è scoperto durante la modifica del file AssemblyInfo tramite VS, poi ha funzionato improvvisamente oO. La modifica manuale di AssemblyInfo.cas in un editor di testo ha reso vuoti tutti i campi. Ad ogni modo, ora è risolto :)
AgentKnopf

7
Vale la pena ricordare che questo non funziona nelle app ASP.NET MVC, a causa del contesto di avvio. Una soluzione alternativa è fare riferimento a un tipo noto nell'assemblaggio del sito Web, ad esempio l'onnipresente MVC HomeController, quindi in Razor:v@(Assembly.GetAssembly(typeof(MyWebProject.Mvc.Controllers.HomeController)).GetName().Version.ToString(2))
James McCormack

38

In MSDN, il metodo Assembly.GetExecutingAssembly è un'osservazione sul metodo "getexecutingassembly", che per motivi di prestazioni, è necessario chiamare questo metodo solo quando non si conosce in fase di progettazione quale assembly è attualmente in esecuzione.

Il modo consigliato per recuperare un oggetto Assembly che rappresenta l'assembly corrente è utilizzare la Type.Assemblyproprietà di un tipo trovato nell'assembly.

L'esempio seguente mostra:

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

Naturalmente questo è molto simile alla risposta con la classe helper "CoreAssembly di classe statica pubblica", ma, se si conosce almeno un tipo di assembly in esecuzione, non è obbligatorio creare una classe helper e fa risparmiare tempo.


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

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

Il GetEntryAssemblymetodo può essere restituito nullquando un assembly gestito è stato caricato da un'applicazione non gestita. Ad esempio, se un'applicazione non gestita crea un'istanza di un componente COM scritto in C #, viene GetEntryAssemblyrestituita una chiamata al metodo dal componente C # null, poiché il punto di ingresso per il processo era codice non gestito anziché un assembly gestito.


2
+1. GetEntryAssembly(vs GetCallingAssemblyo GetExecutingAssembly) sembra essere l'unica cosa che funziona quando viene chiamato da una libreria di riferimento.
drzaus,

6

Questo dovrebbe fare:

Assembly assem = Assembly.GetExecutingAssembly();
AssemblyName aName = assem.GetName();
return aName.Version.ToString();

5
queste 3 righe potrebbero diventare 1: return Assembly.GetExecutingAssembly (). GetName (). Version.ToString (); .............
Alexandre,


1

Product Version può essere preferito se si utilizza il controllo delle versioni tramite GitVersion o altri software di controllo delle versioni.

Per ottenerlo dall'interno della tua biblioteca di classe puoi chiamare System.Diagnostics.FileVersionInfo.ProductVersion:

using System.Diagnostics;
using System.Reflection;

//...

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

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.