2011-10-14 7 views

risposta

53
using System.Reflection.Assembly 
using System.Diagnostics.FileVersionInfo 

// ... 

public string GetInformationalVersion(Assembly assembly) { 
    return FileVersionInfo.GetVersionInfo(assembly.Location).ProductVersion; 
} 
+0

Vedere http://stackoverflow.com/a/19008850/116895 – lance

+7

Si noti che questo codice non funziona se l'assembly non è stato caricato da file o UNC. Questo potrebbe essere il caso se l'assembly è incorporato in un altro assembly (in genere quando nascondi gli assembly) o per qualche altra ragione è stato caricato usando 'Assembly.Load (byte [])' – larsmoa

+2

Inoltre, non funziona se hai 'mkbundle 'd la tua applicazione per Mono – Cocowalla

34
var attr = Assembly 
    .GetEntryAssembly() 
    .GetCustomAttributes(typeof(AssemblyInformationalVersionAttribute), false) 
    as AssemblyInformationalVersionAttribute[]; 

Si tratta di una serie di AssemblyInformationalVersionAttribute. Non è mai nullo anche se non ci sono attributi del tipo cercato.

var attr2 = Attribute 
    .GetCustomAttribute(
     Assembly.GetEntryAssembly(), 
     typeof(AssemblyInformationalVersionAttribute)) 
    as AssemblyInformationalVersionAttribute; 

Questo può essere nullo se l'attributo non è presente.

var attr3 = Attribute 
    .GetCustomAttributes(
     Assembly.GetEntryAssembly(), 
     typeof(AssemblyInformationalVersionAttribute)) 
    as AssemblyInformationalVersionAttribute[]; 

Come prima.

+1

+1; ma puoi usare 'GetCustomAttribute' invece di' GetCustomAttributes' se sai che ci sarà un solo attributo. – vcsjones

+3

@vcsjones Solo utilizzando il metodo statico di 'Attributo', non utilizzando il metodo di istanza di' Assembly' – xanatos

+1

In alcune situazioni, 'Assembly.GetEntryAssembly()' deve essere sostituito da 'Assembly.GetExecutingAssembly()' o 'Assembly. GetCallingAssembly() '. Tipicamente questo è necessario se l'assembly è un plugin - in questo caso 'GetEntryAssembly()' restituirà l'assembly dell'applicazione host. – larsmoa

7
AssemblyInformationalVersionAttribute attribute = 
    (AssemblyInformationalVersionAttribute)Assembly.GetExecutingAssembly() 
    .GetCustomAttributes(typeof(AssemblyInformationalVersionAttribute), false).FirstOrDefault(); 

if (attribute != null) 
    Console.WriteLine(attribute.InformationalVersion); 
+0

+1 in quanto funziona anche con Silverlight o Xbox Lakeview! – ahilsend

10

Anche se la questione è un po 'vecchio:

propongo una soluzione diversa che funziona per me:

Application.ProductVersion 
+4

Ho avuto difficoltà a trovarlo in WPF, è la classe dell'applicazione Winforms. :-) – Wouter

3

Per completare la risposta di lancia: è possibile utilizzare Application.ResourceAssembly.Location per scopri il percorso del file del tuo assembly. Con questo è possibile ottenere la stringa AssemblyInformationalVersion in una sola riga

System.Diagnostics.FileVersionInfo.GetVersionInfo(Application.ResourceAssembly.Location).ProductVersion 
8

Utilizzando un tipo noto nella propria applicazione si può semplicemente fare questo:

using System.Reflection; 

public static readonly string ProductVersion = typeof(MyKnownType).Assembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>().InformationalVersion; 

Naturalmente qualsiasi processo che si utilizza per arrivare al il montaggio a cui è applicato il tuo attributo è buono. Si noti che questo non si basa su System.Diagnostics o sull'oggetto Application di WinForm.

0

Costruzione off di @ risposta di Aerthal, se volete un uno di linea per ottenere l'AssemblyInformationalVersionAttribute da un MVC Razor Vista:

@System.Diagnostics.FileVersionInfo.GetVersionInfo(typeof(Zeroarc.Candid.Web.MvcApplication).Assembly.Location).ProductVersion