Ottieni il numero di versione di una DLL al livello di programmazione

È ansible ottenere il numero di versione a livello di programmazione da qualsiasi DLL .NET?

Se sì, come?

Assembly assembly = Assembly.LoadFrom("MyAssembly.dll"); Version ver = assembly.GetName().Version; 

Importante: Va notato che questa non è la migliore risposta alla domanda originale. Non dimenticare di leggere di più su questa pagina.

Funziona se la DLL è .net o Win32 . I metodi di riflessione funzionano solo se la DLL è .net. Inoltre, se si utilizza la riflessione, si ha il sovraccarico di caricare l’intera DLL in memoria. Il metodo seguente non carica l’assembly in memoria.

 // Get the file version for the notepad. FileVersionInfo myFileVersionInfo = FileVersionInfo.GetVersionInfo(@"C:\MyAssembly.dll"); // Print the file name and version number. Console.WriteLine("File: " + myFileVersionInfo.FileDescription + '\n' + "Version number: " + myFileVersionInfo.FileVersion); 

Da: http://msdn.microsoft.com/en-us/library/system.diagnostics.fileversioninfo.fileversion.aspx

fonte originale

Prima di tutto, ci sono due possibili “versioni” a cui potresti essere interessato:

  • Versione del file system di Windows, applicabile a tutti i file eseguibili

  • Assembly build version, che è incorporato in un assembly .NET dal compilatore (ovviamente applicabile solo a .NET assembly dll e exe files)

Nel primo caso, dovresti usare la risposta di Ben Anderson; in quest’ultimo caso, utilizzare AssemblyName.GetAssemblyName(@"c:\path\to\file.dll").Version , o la risposta di Tataro, nel caso in cui l’assembly sia referenziato dal proprio codice.

Si noti che è ansible ignorare tutte le risposte che utilizzano i .Load() / .LoadFrom() , poiché questi caricano effettivamente l’assembly .LoadFrom() corrente, il che è analogo .LoadFrom() un albero per vedere quanti anni ha.

Per averlo per l’assembly che è stato avviato (winform, console app, ecc …)

 using System.Reflection; ... Assembly.GetEntryAssembly().GetName().Version 

Ecco un buon modo usando un po ‘di riflessione per ottenere una versione di una DLL contenente una particolare class:

 var ver = System.Reflection.Assembly.GetAssembly(typeof(!Class!)).GetName().Version; 

Basta sostituire! Classe! con il nome di una class che è definita nella DLL che si desidera ottenere la versione di.

Questo è il mio metodo preferito perché se sposto le DLL in giro per distribuzioni diverse non devo modificare il percorso file.

Kris, la tua versione funziona alla grande quando devi caricare l’assembly dal file DLL reale (e se c’è la DLL!), Tuttavia, si otterrà un errore molto indesiderato se la DLL è EMBEDDED (cioè, non un file ma un embedded DLL).

L’altra cosa è, se si usa uno schema di versioning con qualcosa come ” 1.2012.0508.0101 “, quando si ottiene la stringa di versione si otterrà effettivamente ” 1.2012.518.101 “; notare gli zeri mancanti .

Quindi, ecco alcune funzioni extra per ottenere la versione di una DLL (incorporata o dal file DLL):

  public static System.Reflection.Assembly GetAssembly(string pAssemblyName) { System.Reflection.Assembly tMyAssembly = null; if (string.IsNullOrEmpty(pAssemblyName)) { return tMyAssembly; } tMyAssembly = GetAssemblyEmbedded(pAssemblyName); if (tMyAssembly == null) { GetAssemblyDLL(pAssemblyName); } return tMyAssembly; }//System.Reflection.Assembly GetAssemblyEmbedded(string pAssemblyDisplayName) public static System.Reflection.Assembly GetAssemblyEmbedded(string pAssemblyDisplayName) { System.Reflection.Assembly tMyAssembly = null; if(string.IsNullOrEmpty(pAssemblyDisplayName)) { return tMyAssembly; } try //try #a { tMyAssembly = System.Reflection.Assembly.Load(pAssemblyDisplayName); }// try #a catch (Exception ex) { string m = ex.Message; }// try #a return tMyAssembly; }//System.Reflection.Assembly GetAssemblyEmbedded(string pAssemblyDisplayName) public static System.Reflection.Assembly GetAssemblyDLL(string pAssemblyNameDLL) { System.Reflection.Assembly tMyAssembly = null; if (string.IsNullOrEmpty(pAssemblyNameDLL)) { return tMyAssembly; } try //try #a { if (!pAssemblyNameDLL.ToLower().EndsWith(".dll")) { pAssemblyNameDLL += ".dll"; } tMyAssembly = System.Reflection.Assembly.LoadFrom(pAssemblyNameDLL); }// try #a catch (Exception ex) { string m = ex.Message; }// try #a return tMyAssembly; }//System.Reflection.Assembly GetAssemblyFile(string pAssemblyNameDLL) public static string GetVersionStringFromAssembly(string pAssemblyDisplayName) { string tVersion = "Unknown"; System.Reflection.Assembly tMyAssembly = null; tMyAssembly = GetAssembly(pAssemblyDisplayName); if (tMyAssembly == null) { return tVersion; } tVersion = GetVersionString(tMyAssembly.GetName().Version.ToString()); return tVersion; }//string GetVersionStringFromAssemblyEmbedded(string pAssemblyDisplayName) public static string GetVersionString(Version pVersion) { string tVersion = "Unknown"; if (pVersion == null) { return tVersion; } tVersion = GetVersionString(pVersion.ToString()); return tVersion; }//string GetVersionString(Version pVersion) public static string GetVersionString(string pVersionString) { string tVersion = "Unknown"; string[] aVersion; if (string.IsNullOrEmpty(pVersionString)) { return tVersion; } aVersion = pVersionString.Split('.'); if (aVersion.Length > 0) { tVersion = aVersion[0]; } if (aVersion.Length > 1) { tVersion += "." + aVersion[1]; } if (aVersion.Length > 2) { tVersion += "." + aVersion[2].PadLeft(4, '0'); } if (aVersion.Length > 3) { tVersion += "." + aVersion[3].PadLeft(4, '0'); } return tVersion; }//string GetVersionString(Version pVersion) public static string GetVersionStringFromAssemblyEmbedded(string pAssemblyDisplayName) { string tVersion = "Unknown"; System.Reflection.Assembly tMyAssembly = null; tMyAssembly = GetAssemblyEmbedded(pAssemblyDisplayName); if (tMyAssembly == null) { return tVersion; } tVersion = GetVersionString(tMyAssembly.GetName().Version.ToString()); return tVersion; }//string GetVersionStringFromAssemblyEmbedded(string pAssemblyDisplayName) public static string GetVersionStringFromAssemblyDLL(string pAssemblyDisplayName) { string tVersion = "Unknown"; System.Reflection.Assembly tMyAssembly = null; tMyAssembly = GetAssemblyDLL(pAssemblyDisplayName); if (tMyAssembly == null) { return tVersion; } tVersion = GetVersionString(tMyAssembly.GetName().Version.ToString()); return tVersion; }//string GetVersionStringFromAssemblyEmbedded(string pAssemblyDisplayName) 
 var versionAttrib = new AssemblyName(Assembly.GetExecutingAssembly().FullName); 

È ansible utilizzare i metodi System.Reflection.Assembly.Load * () e quindi prendere il loro AssemblyInfo.

Mentre la domanda originale potrebbe non essere stata specifica per un servizio Web, qui è un testWebService completo che è ansible aggiungere per visualizzare una risposta non in cache del servizio Web più la versione del file. Usiamo la versione del file invece della versione di assemblaggio perché vogliamo conoscere una versione, ma con tutte le versioni di assembly 1.0.0.0, il sito Web può essere facilmente corretto (link di firma e domanda ancora attivi!). Sostituisci @ Class @ con il nome del controller web api in cui è incorporato questo servizio. È buono per un go / nogo su un servizio web più un controllo rapido della versione.

  [Route("api/testWebService")] [AllowAnonymous] [HttpGet] public HttpResponseMessage TestWebService() { HttpResponseMessage responseMessage = Request.CreateResponse(HttpStatusCode.OK); string loc = Assembly.GetAssembly(typeof(@[email protected])).Location; FileVersionInfo versionInfo = FileVersionInfo.GetVersionInfo(loc); responseMessage.Content = new StringContent($"

The XXXXX web service GET test succeeded.

{DateTime.Now}

File Version: {versionInfo.FileVersion}"); responseMessage.Content.Headers.ContentType = new MediaTypeHeaderValue("text/html"); Request.RegisterForDispose(responseMessage); return responseMessage; }

Ho trovato anche necessario aggiungere quanto segue a web.config in configurazione per renderlo veramente anonimo