Come posso ottenere la versione del file assembly


727

In AssemblyInfoci sono due versioni di assemblaggio:

  1. AssemblyVersion: Specifica la versione dell'assembly da attribuire.
  2. AssemblyFileVersion: Indica a un compilatore di utilizzare un numero di versione specifico per la risorsa versione file Win32. Non è necessario che la versione del file Win32 corrisponda al numero di versione dell'assembly.

Posso ottenere Assembly Versioncon la seguente riga di codice:

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

Ma come posso ottenere Assembly File Version?


2
Che cosa intendi per "versione del file assembly" anziché "versione assembly"? Puoi fare un esempio?
Xiaofu,

7
@Xiaofu - "Assembly Version" è ciò che .NET utilizza internamente. "Assembly File Version" è ciò che viene mostrato quando si fa clic con il tasto destro su un file e si passa a "proprietà", quindi alla scheda "dettagli". Non sono gli stessi.
rory.ap,

Ho scoperto che la versione dell'assembly è quella utilizzata per determinare la posizione user.config in AppData.
Kyle Delaney,

Risposte:


867

Vedi il mio commento sopra per chiedere chiarimenti su ciò che veramente vuoi. Spero che sia questo:

System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
System.Diagnostics.FileVersionInfo fvi = System.Diagnostics.FileVersionInfo.GetVersionInfo(assembly.Location);
string version = fvi.FileVersion;

4
@Xiaofu: esiste un modo per ottenere invece i numeri di versione da un file AssemblyInfo.cs?
Markus

56
Un problema con questo codice è che, in realtà, restituirà 1.0. *. * Se non hai specificato i numeri Build e Revision. AssemblyName.GetAssemblyName (assembly.Location) .Version.ToString (); otterrai il numero di versione 'compilato', che dovrebbe essere lo stesso di FileVersion, se stai impostando entrambe le versioni allo stesso modo.
Doguhan Uluca,

17
@DoguhanUluca Sono due cose diverse. Questo ti darà la versione dell'assembly, non la versione del file. "Se si impostano entrambe le versioni allo stesso modo" è una soluzione alternativa, non una soluzione.
Nyerguds,

1
Ha FileVersionInfosolo stringproprietà e nessuna Versionproprietà?
Kyle Delaney,

3
@Yitzchak: Assembly.GetEntryAssembly()restituisce NULL ad esempio nel contesto dei componenti aggiuntivi di Office e anche in molti altri casi. Inoltre, se pensi a componenti aggiuntivi / plug-in - EntryAssembly è l'applicazione host e molto spesso vuoi la versione di YourCode (TM) :) A parte questo, vale la pena aggiungere a questa risposta che assembly.Locationutilizzata nella risposta può essere anche nulla (vale a dire il primo caso a caso su google : github.com/Azure/azure-functions-host/issues/1233 ) e ciò probabilmente accade anche più spesso di avere un entry-assembly nullo.
quetzalcoatl,

209

Esistono tre versioni : assembly , file e product . Sono utilizzati da diverse funzionalità e assumono valori predefiniti diversi se non specificati esplicitamente.

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
Per quando quel post sul blog scompare un giorno, qui viene bollito per riferimento: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;
JMD

3
E per coloro che desiderano specificarli nel file AssemblyInfo.cs, per assemblyVersion use (con qualsiasi numero desiderato) === [assembly: AssemblyVersion("2.0.*")]per fileVersion use === [assembly: AssemblyFileVersion("2.0.*")]e per productVersion use === [assembly: AssemblyInformationalVersion("2.0.*")] L'ultimo può prendere il suffisso stringa per SemVercompatibilità:[assembly: AssemblyInformationalVersion("2.0.0-alpha")]
Jesse Chisholm,

Addendum: AssemblyFileVersionnon può usare la *notazione del suffisso. :( Ha bisogno di tutti e quattro i numeri.[assembly: AssemblyFileVersion("2.0.0.1")]
Jesse Chisholm,

66

Quando voglio accedere alla versione del file dell'applicazione (cosa è impostato in Informazioni sull'assieme -> Versione del file), dire di impostare il testo di un'etichetta su di esso al caricamento del modulo per visualizzare la versione, ho appena usato

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

53
Si noti che ciò richiede un riferimento a System.Windows.Forms e quindi potrebbe non essere adatto a tutte le applicazioni.
BradleyDotNET,

2
Sfortunatamente, questa è una stringa. Non è l'ideale se si desidera formattarlo da soli in un tipo di formato "v1.08" più semplice. Molto più pratico se effettivamente si ottiene l'oggetto versione per ottenere i sottocomponenti come numeri interi.
Nyerguds,

1
Inoltre, questo raccoglie AssemblyFileVersion da AssemblyInfo, non AssemblyVersion, quindi
fai

Un utente di alto livello potrebbe modificare questa risposta per rendere più chiaro che questo è solo per Windows Form?
jrh

Questo è esattamente quello che stavo cercando, grazie per la risposta!
David Refoua,

23

AGGIORNAMENTO: Come menzionato da Richard Grimes nel mio post citato , @Iain e @Dmitry Lobanov, la mia risposta è giusta in teoria ma sbagliata in pratica.

Come avrei dovuto ricordare da innumerevoli libri, ecc., Mentre si impostano queste proprietà usando il [assembly: XXXAttribute], vengono messe in risalto dal compilatore e inserite nella VERSIONINFOrisorsa.

Per il motivo sopra riportato, è necessario utilizzare l'approccio nella risposta di @ Xiaofu poiché gli attributi vengono rimossi dopo che il segnale è stato estratto da essi.


stringa statica pubblica GetProductVersion ()
{
  Attributo var = (AssemblyVersionAttribute) Assembly
    .GetExecutingAssembly ()
    .GetCustomAttributes (typeof (AssemblyVersionAttribute), true)
    La singola ();
   attributo return.InformationalVersion;
}

(Da http://bytes.com/groups/net/420417-assemblyversionattribute - come indicato qui, se stai cercando un attributo diverso, sostituiscilo con quanto sopra)


Ehi Ruben, 2 note. Innanzitutto, la domanda posta per AssemblyFileVersion non AssemblyVersion. In secondo luogo, Assembly.GetExecutingAssembly (). GetCustomAttributes (typeof (AssemblyVersionAttribute), true) restituisce un array di lunghezza 0. Penso che ciò sia dovuto al fatto che AssemblyVersionAttribute non è un attributo personalizzato.
Iain,

Per quanto riguarda il primo punto, ecco perché ho detto "se stai cercando un attributo diverso, sostituiscilo con quanto sopra" (IIRC non l'ho provato). Per quanto riguarda il secondo, sembra plausibile ma non ho tempo di scavare ...
Ruben Bartelink,

Sì, in realtà non è possibile ottenere l'attributo AssemblyVersion tramite .GetCustomAttribute (), la versione dell'assembly può essere recuperata AssemblyName.Versionsolo tramite la proprietà. Ma con ogni altro attributo è il modo giusto per farlo
Dmitrii Lobanov

@DmitryLobanov e Iain Grazie per le istruzioni. Spero che la modifica lo copra sufficientemente per rendere la risposta degna di essere conservata anziché eliminarla - fammi sapere!
Ruben Bartelink,

1
Ho usato AssemblyInformationalVersionAttributeinvece AssemblyVersionAttributesu .net core 3.1
Vasya Milovidov il

5

Usa questo:

((AssemblyFileVersionAttribute)Attribute.GetCustomAttribute(
    Assembly.GetExecutingAssembly(), 
    typeof(AssemblyFileVersionAttribute), false)
).Version;

O questo:

new Version(System.Windows.Forms.Application.ProductVersion);
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.