A livello di codice ottenere il numero di versione di una DLL


151

È possibile ottenere il numero di versione a livello di codice da qualsiasi DLL .NET?

Se si, come?


10
Non posso credere che questo sia stato chiesto 6 minuti fa, stavo per chiedere lo stesso!
potenza

2
controlla anche questo link per la versione con incremento automatico - blog.mbcharbonneau.com/2007/03/13/…
JL.

Risposte:


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

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


28
Questo carica MyAssembly.dll in AppDomain in esecuzione ... cattiva idea.
staafl

12
Consiglio Assemblyname.GetAssemblyNamedi evitare questi problemi
staafl

7
il caricamento di un assembly nell'appdomain è lento, irreversibile (non è possibile scaricarlo senza uccidere il dominio), richiede autorizzazioni ed è suscettibile di causare effetti collaterali, come l'esecuzione di beforefieldinitinizializzatori di tipo, e in questo caso non è richiesto. Questi motivi sono abbastanza validi?
staafl

7
@staafl: Sì; non solo per me, ma anche per tutti gli altri che leggeranno questa pagina in futuro.
Kris,

6
FileVersionInfo.GetVersionInfo("foo.dll").FileVersionfa bene il lavoro e non carica la dll nell'applicazione.
Jack,

181

Funziona se la dll è .net o Win32 . I metodi di riflessione funzionano solo se la dll è .net. Inoltre, se usi la riflessione, hai il sovraccarico di caricare l'intera dll in memoria. Il metodo seguente non carica l'assembly in memoria.

// Get the file version.
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


5
Mi piace questo. Perché dovresti preoccuparti di caricare la dll e quindi utilizzare la riflessione solo per ottenere la versione, quando tutto ciò che vuoi davvero fare è questo ???
aggieNick02,

@ben, potresti modificare il post? Ho visto che avevo perso -1 rappresentante aggiungendo un voto negativo, che non ricordo di aver fatto. non mi permette di cambiarlo, a meno che non modifichi il post. Saluti!
Luke Duddridge,

9
Se volete essere sicuri di ottenere l'eseguibile / dll in realtà attualmente in uso: al posto di un nome di file statico ( @"C:\MyAssembly.dll"sopra), è possibile utilizzare System.Reflection.Assembly.GetExecutingAssembly().Location(o se una DLL: Assembly.GetAssembly(typeof(AClassInTheDll)).Location)
Conrad

4
È la differenza tra gli attributi AssemblyVersion e AssemblyFileVersion. AssemblyFileVersion viene timbrato in modo tale che l'API di Windows possa ottenere il valore. AssemblyVersion fa parte del nome sicuro e non è necessariamente uguale a AssemblyFileVersion.
Daughey,

51

Innanzitutto, ci sono due possibili "versioni" che potrebbero interessarti:

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

  • Versione build dell'assembly, che è integrata in un assembly .NET dal compilatore (ovviamente applicabile solo ai file dll ed exe di assembly .NET)

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 faccia riferimento al proprio codice.

Nota che puoi ignorare tutte le risposte che usano .Load()/ .LoadFrom()metodi, dal momento che questi caricano effettivamente l'assembly nell'attuale AppDomain, che è analogo al tagliare un albero per vedere quanti anni ha.


32

Ecco un bel modo di usare un po 'di riflessione per ottenere una versione di una DLL contenente una particolare classe:

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

Basta sostituire! Class! con il nome di una classe definita nella DLL di cui si desidera ottenere la versione.

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


3
Si noti che questo funziona solo se l'assembly in questione è referenziato staticamente da quello corrente.
staafl

2
Questa è la risposta migliore dal momento che la DLL non è necessariamente l'assembly di entrata, nemmeno l'assembly da cui viene chiamato
CAD bloke,

1
Vedere stackoverflow.com/a/909583/492 per ottenere diversi tipi di informazioni sulla versione. es.FileVersionInfo
CAD bloke,

22

Per ottenerlo per l'assembly avviato (winform, app console, ecc ...)

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

6
Anche GetExecutingAssembly () potrebbe essere d'aiuto.
Bolt Thunder,

10

Kris, la tua versione funziona benissimo quando è necessario caricare l'assembly dal file DLL effettivo (e se la DLL è lì!), Tuttavia, si otterrà un errore molto indesiderato se la DLL è EMBEDDED (ovvero, non un file ma un incorporato DLL).

L'altra cosa è che se si utilizza 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)

2
var versionAttrib = new AssemblyName(Assembly.GetExecutingAssembly().FullName);

2

La risposta di @Ben si è rivelata utile per me. Ma avevo bisogno di controllare la versione del prodotto in quanto era l'incremento principale nel mio software e seguivo il controllo delle versioni semantico.

myFileVersionInfo.ProductVersion

Questo metodo ha soddisfatto le mie aspettative

Aggiornamento: Invece di menzionare esplicitamente il percorso DLL nel programma (come necessario nella versione di produzione), possiamo ottenere la versione del prodotto usando Assembly.

Assembly assembly = Assembly.GetExecutingAssembly();
FileVersionInfo fileVersionInfo =FileVersionInfo.GetVersionInfo(assembly.Location); 
string ProdVersion= fileVersionInfo.ProductVersion;

Nota: se la versione contiene un asterisco per il valore auto-incrementato, questo metodo restituirà l'asterisco invece del numero effettivo generato (ovvero non funziona se si inserisce 1.0. * Nelle informazioni sull'assieme).
Ronen Ness,

Sì! Tuttavia, ho scelto l'automazione Jeniks per l'aggiornamento della versione, quindi assembly ha sempre una combinazione perfetta di versione DLL.
Prasan Dutt,

1

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


0

Mentre la domanda originale potrebbe non essere stata specifica per un servizio Web, ecco un testWebService completo che è possibile aggiungere per visualizzare una risposta non memorizzata nella cache di un servizio Web più la versione del file. Usiamo la versione del file invece della versione dell'assembly perché vogliamo conoscere una versione, ma con tutte le versioni dell'assembly 1.0.0.0, il sito web può essere facilmente patchato (firma e collegamento richiesta ancora attivi!). Sostituisci @ Class @ con il nome del controller API Web in cui è incorporato questo servizio. È utile per andare / andare su un servizio Web più un rapido controllo della versione.

  [Route("api/testWebService")]
  [AllowAnonymous]
  [HttpGet]
  public HttpResponseMessage TestWebService()
  {
      HttpResponseMessage responseMessage = Request.CreateResponse(HttpStatusCode.OK);
      string loc = Assembly.GetAssembly(typeof(@Class@)).Location;
      FileVersionInfo versionInfo = FileVersionInfo.GetVersionInfo(loc);
      responseMessage.Content = new StringContent($"<h2>The XXXXX web service GET test succeeded.</h2>{DateTime.Now}<br/><br/>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

<location path="api/testwebservice">
    <system.web>
        <authorization>
            <allow users="*" />
        </authorization>
    </system.web>
</location>
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.