2009-11-18 11 views
104

Czy można uzyskać numer wersji programowo z dowolnej biblioteki .NET DLL?Programowo uzyskać numer wersji biblioteki DLL

Jeśli tak, w jaki sposób?

+10

Nie mogę uwierzyć, że zostało to zadane 6 minut temu, właśnie chciałem zapytać o to samo! – tpower

+0

lol - pracował dla mnie ... –

+0

sprawdź ten link także dla wersji z automatyczną inkrementacją - http://blog.mbcharbonneau.com/2007/03/13/auto-incrementing-build-numbers-in-visual-studio/ –

Odpowiedz

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

Ważne: Należy zauważyć, że nie jest to najlepsza odpowiedź do pierwotnego pytania. Nie zapomnij przeczytać więcej na tej stronie.

+18

Powoduje załadowanie pliku MyAssembly.dll do działającego złego pomysłu AppDomain ... – staafl

+2

@staafl: Czułem, że jest to najbardziej prawdopodobne, co chciał OP. Jeśli nie, istnieje również "Assembly.ReflectionOnlyLoadFrom" zobacz http://msdn.microsoft.com/en-us/library/system.reflection.assembly.reflectiononlyloadfrom.aspx – Kris

+0

Nie wierzę, że PO implikował to w jakikolwiek sposób. Ponadto ReflectionOnlyLoadFrom ma swoje własne efekty uboczne: "Kontekst przeznaczony tylko do odbicia nie różni się od innych kontekstów. Zespoły ładowane do kontekstu można rozładować tylko przez rozładowanie domeny aplikacji." – staafl

1

Można użyć metod System.Reflection.Assembly.Load *(), a następnie pobrać ich AssemblyInfo.

20

Aby dostać się za zespołem, który został uruchomiony (winform, app konsoli, etc ...)

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

GetExecutingAssembly() również może pomóc. –

7

Kris, wersja działa świetnie, kiedy potrzebują, aby załadować zespół od rzeczywistego pliku DLL (i jeśli DLL istnieje!), jednak otrzymamy bardzo niechciany błąd, jeśli DLL jest EMBEDDED (tj. nie jest plikiem, ale osadzoną biblioteką DLL).

Inną rzeczą jest, jeśli ktoś wykorzystuje schemat wersjonowania z czymś w rodzaju „1.2012.0508.0101”, gdy jeden dostaje ciąg wersji będziesz rzeczywiście dostać „1.2012.518.101”; zanotuj brakujące.

Tak więc, oto kilka dodatkowych funkcji, aby uzyskać wersji DLL (wbudowany lub z pliku 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) 
1
var versionAttrib = new AssemblyName(Assembly.GetExecutingAssembly().FullName); 
18

Oto dobry sposób, przy użyciu odrobiny refleksji, aby uzyskać wersji biblioteki DLL zawierającej określoną klasę:

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

Po prostu zastąp! Class! z nazwą klasy zdefiniowanej w bibliotece DLL, do której chcesz uzyskać wersję.

To jest moja preferowana metoda, ponieważ jeśli przeniesię biblioteki DLL dla różnych wdrożeń, nie muszę zmieniać ścieżki do plików.

+2

Należy zauważyć, że działa to tylko wtedy, gdy do danego zestawu odwołuje się statycznie bieżący. – staafl

+0

To jest najlepsza odpowiedź, ponieważ biblioteka DLL niekoniecznie jest zbiorem wpisowym, a nawet zbiór ten jest nazywany od –

+0

Zobacz https://stackoverflow.com/a/909583/492, aby uzyskać różne typy informacji o wersji. np. 'FileVersionInfo' –

127

Działa to, jeśli biblioteka DLL jest .net lub Win32. Metody Odbicia działają tylko wtedy, gdy biblioteka DLL jest .net. Ponadto, jeśli używasz refleksji, masz narzut ładowania całej biblioteki DLL do pamięci. Poniższa metoda nie ładuje zestawu do pamięci.

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

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

original source

+3

Podoba mi się to. Dlaczego miałbyś niepokoić ładowanie biblioteki dll, a następnie używać refleksji tylko po to, aby uzyskać wersję, kiedy naprawdę chcesz to zrobić? – aggieNick02

+1

+1 Doskonały, dokładnie to, czego potrzebowałem. –

+0

@ben, czy mógłbyś edytować wpis? Widziałem, że straciłem -1 przedstawiciela z dodania downwote, którego nie pamiętam. nie pozwolę mi tego zmienić, chyba że edytujesz post. Twoje zdrowie! –

36

Przede wszystkim, istnieją dwa możliwe 'wersje', które mogą Cię zainteresować:

  • wersja pliku systemu plików Windows dotyczy do wszystkich plików wykonywalnych

  • Wersja kompilacji złożenia, osadzona w zestawie .NET przez kompilator (oczywiście dotyczy tylko.Pliki dll i exe zestawu NET)

W pierwszym przypadku powinieneś użyć odpowiedzi Bena Andersona; w tym ostatnim przypadku użyj AssemblyName.GetAssemblyName(@"c:\path\to\file.dll").Version, lub odpowiedzi Tataro, na wypadek, gdy do zestawu odwołuje się twój kod.

Zauważ, że możesz zignorować wszystkie odpowiedzi, które używają metod, ponieważ faktycznie ładują zespół w bieżącym AppDomain - co jest analogiczne do wycinania drzewa, aby zobaczyć, ile ma lat.

+8

+1 To jest odpowiedź bardziej optymalna niż moja. – Kris