2011-02-09 20 views
132

Sto cercando di ottenere la versione di assembly in esecuzione in C# 3.0 utilizzando il seguente codice:Come posso ottenere la versione in esecuzione?

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

C'è un altro modo corretto di farlo?

risposta

231

due opzioni ... a prescindere dal tipo di applicazione si può sempre invocare:

Assembly.GetExecutingAssembly().GetName().Version 

Se un'applicazione Windows Forms, è sempre possibile accedere tramite l'applicazione se in cerca specificatamente per la versione del prodotto.

Application.ProductVersion 

Uso GetExecutingAssembly per un riferimento assembly non è sempre un'opzione. Come tale, io personalmente trovo utile per creare una classe di supporto statica in progetti in cui io possa necessario fare riferimento alla versione di montaggio o di montaggio 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; 
} 

allora posso pulita riferimento CoreAssembly.Version nel mio codice, come richiesto.

+5

Se è schierato con ClickOnce, è necessario controllare 'System.Deployment.Application.ApplicationDeployment.CurrentDeployment.CurrentVersion' –

+0

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

+0

@Zainodis Se ti riferisci alla versione 'ClickOnce' menzionata da @Justin, è specificato nella scheda 'Pubblica' all'interno delle proprietà del progetto (cioè, non correlato a AssemblyVersion o AssemblyFileVersion). –

5

Questo dovrebbe fare:

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

questa 3 righe potrebbe diventare 1: return Assembly.GetExecutingAssembly(). GetName(). Version.ToString(); ............. – Alexandre

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

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

Il metodo GetEntryAssembly può tornare null quando 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#, una chiamata al componente GetEntryAssembly dal componente C# restituisce null, poiché il punto di ingresso per il processo era codice non gestito anziché assembly gestito.

+2

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

29

In MSDN, Assembly.GetExecutingAssembly Method, è un'osservazione sul metodo "GetExecutingAssembly", che per motivi di prestazioni, si dovrebbe chiamare questo metodo solo quando non si sa in fase di progettazione che cosa assemblaggio è attualmente in esecuzione.

Il modo consigliato per recuperare un oggetto Assembly che rappresenta l'assieme corrente consiste nell'utilizzare la proprietà Type.Assembly di un tipo trovato nell'assieme.

Il seguente esempio illustra:

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 "class public static CoreAssembly", ma, se si conosce almeno un tipo di esecuzione di montaggio, esso isn È obbligatorio creare una classe di supporto e risparmiare tempo.

+0

Molto meglio delle altre risposte utilizzando GetExecutingAssembly –

Problemi correlati