2009-11-18 9 views
104

Ist es möglich, die Versionsnummer programmgesteuert von jedem .NET DLL zu erhalten?Programmgesteuert erhalten Sie die Versionsnummer einer DLL

Wenn ja, wie?

+10

Ich kann nicht glauben, dass dies vor 6 Minuten gefragt wurde, war gerade dabei, das gleiche zu fragen! – tpower

+0

lol - für mich gearbeitet ... –

+0

überprüfen Sie diesen Link auch für automatisch inkrementieren Version - http://blog.mbcharbonneau.com/2007/03/13/auto-incrementing-build-numbers-in-visual-studio/ –

Antwort

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

Wichtig: Es sollte beachtet werden, dass dies nicht die beste Antwort auf die ursprüngliche Frage. Vergessen Sie nicht, mehr auf dieser Seite zu lesen.

+18

Das lädt MyAssembly.dll in die laufende AppDomain ... schlechte Idee. – staafl

+2

@staafl: Ich glaube, das ist höchstwahrscheinlich genau das, was der OP wollte. Wenn nicht, gibt es auch "Assembly.ReflectionOnlyLoadFrom" siehe http://msdn.microsoft.com/en-us/library/system.reflection.assembly.reflectiononlyloadfrom.aspx – Kris

+0

Ich glaube nicht, dass das OP es in irgendeiner Weise implizierte. ReflectionOnlyLoadFrom hat auch seine eigenen Nebenwirkungen - "Der Reflection-Only-Kontext unterscheidet sich nicht von anderen Kontexten. Assemblies, die in den Kontext geladen werden, können nur durch das Entladen der Anwendungsdomäne entladen werden." – staafl

1

Sie können System.Reflection.Assembly.Load *() -Methoden verwenden und dann ihre AssemblyInfo abrufen.

20

Um es für die Montage zu erhalten, die gestartet wurde (winform, Konsole app, etc ...)

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

GetExecutingAssembly() könnte auch helfen. –

7

Kris, Ihre Version funktioniert gut, wenn die Baugruppe von der tatsächlichen DLL-Datei zu laden, um (und Wenn die DLL vorhanden ist!), wird jedoch ein sehr unerwünschter Fehler angezeigt, wenn die DLL EMBEDDED ist (dh keine Datei, sondern eine eingebettete DLL).

Die andere Sache ist, wenn man ein Versionsschema mit etwas verwendet wie „1.2012.0508.0101“, wenn man die String-Version bekommt werden Sie tatsächlich „1.2012.518.101“ erhalten; Beachten Sie die fehlenden Nullen.

So, hier ist ein paar zusätzliche Funktionen, um die Version einer DLL (eingebettet oder aus der DLL-Datei) zu erhalten:

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) 
1
var versionAttrib = new AssemblyName(Assembly.GetExecutingAssembly().FullName); 
18

Hier ist eine schöne Möglichkeit, ein wenig Reflexion mit einer Version zu erhalten einer DLL mit einer bestimmten Klasse:

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

Ersetzen Sie einfach! Klasse! mit dem Namen einer Klasse, die in der DLL definiert ist, von der Sie die Version von.

Dies ist meine bevorzugte Methode, weil ich den Dateipfad nicht ändern muss, wenn ich die DLLs für verschiedene Bereitstellungen verschiebe.

+2

Beachten Sie, dass dies nur funktioniert, wenn die fragliche Assembly von der aktuellen referenziert wird. – staafl

+0

Dies ist die beste Antwort, da die DLL nicht unbedingt die Eingabe Assembly ist nicht einmal die Assembly das heißt von –

+0

Siehe https://stackoverflow.com/a/909583/492 für verschiedene Arten von Versionsinformationen. zB 'FileVersionInfo' –

127

Dies funktioniert, wenn die DLL .net oder Win32 ist. Reflektionsmethoden funktionieren nur, wenn die DLL .net ist. Wenn Sie Reflektion verwenden, müssen Sie außerdem die gesamte DLL in den Speicher laden. Die folgende Methode lädt die Assembly nicht in den Speicher.

// 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); 

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

original source

+3

Ich mag das. Warum würdest du dir die Mühe machen, die DLL zu laden und dann die Reflektion zu benutzen, nur um die Version zu bekommen, wenn du nur das wirklich willst? – aggieNick02

+1

+1 Ausgezeichnet, genau was ich brauchte. –

+0

@ben, könnten Sie den Beitrag bearbeiten? Ich sah, dass ich -1 rep durch das Hinzufügen eines Downvotes verloren hatte, an den ich mich nicht erinnere. Es lässt mich nicht ändern, es sei denn, Sie bearbeiten den Beitrag. Prost! –

36

Zunächst einmal gibt es zwei mögliche 'Versionen', es könnte dich interessieren:

  • Windows-Dateisystem Dateiversion, anwendbar zu allen ausführbaren Dateien

  • Assembly - Build - Version, die vom Compiler in eine .NET Assembly eingebettet wird (offensichtlich nur für.NET Assembly-DLL und EXE-Dateien)

Im ersteren Fall sollten Sie Ben Anderson Antwort verwenden; Im letzteren Fall verwenden Sie AssemblyName.GetAssemblyName(@"c:\path\to\file.dll").Version oder Tataros Antwort, falls die Assembly durch Ihren Code referenziert wird.

Beachten Sie, dass Sie alle Antworten ignorieren können, die .Load()/.LoadFrom() Methoden verwenden, da diese tatsächlich die Assembly in der aktuellen AppDomain laden - was analog zum Abschneiden eines Baumes ist, um zu sehen, wie alt er ist.

+8

+1 Dies ist eine optimale Antwort als meine. – Kris

Verwandte Themen