2009-11-18 78 views
104

是否可以從任何.NET DLL以編程方式獲取版本號?以編程方式獲取DLL的版本號

如果是,如何?

+10

不能相信這是問了6分鐘前,正要問同樣的! – tpower 2009-11-18 12:03:24

+0

哈哈 - 爲我工作... – 2009-11-18 12:50:26

+0

查看這個鏈接也爲自動遞增版本 - http://blog.mbcharbonneau.com/2007/03/13/auto-incrementing-build-numbers-in-visual-studio/ – 2009-11-18 12:50:57

回答

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

重要: 應當指出的是,這是不是最好的答案,原來的問題。不要忘記在此頁面上閱讀更多內容。

+18

這會將MyAssembly.dll加載到正在運行的AppDomain中......壞主意。 – staafl 2013-10-10 13:03:38

+2

@staafl:我覺得這很可能是OP想要的。如果沒有,還有「Assembly.ReflectionOnlyLoadFrom」請參閱http://msdn.microsoft.com/en-us/library/system.reflection.assembly.reflectiononlyloadfrom.aspx – Kris 2013-10-10 13:36:08

+0

我不相信OP以任何方式暗示它。此外,ReflectionOnlyLoadFrom還有其自身的副作用 - 「僅反射上下文與其他上下文沒有區別,加載到上下文中的程序集只能通過卸載應用程序域來卸載。」 – staafl 2013-10-10 13:49:43

1

您可以使用System.Reflection.Assembly.Load *()方法,然後獲取其AssemblyInfo。

20

爲了得到它而啓動的組件(WinForm的,控制檯應用程序等等)

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

GetExecutingAssembly()也可能有所幫助。 – 2013-05-27 08:57:24

7

克里斯,你的版本需要加載從實際的DLL文件彙編時的偉大工程(和如果DLL在那裏!),但是,如果DLL是EMBEDDED(即,不是文件,而是嵌入式DLL),會得到一個不需要的錯誤。

的另一件事是,如果使用了版本控制方案的東西,如「1.2012.0508.0101」,當一個人得到的版本字符串,你就會得到「1.2012.518.101」; 注意缺失的零

所以,這裏的一些額外的功能,以獲得一個DLL(嵌入式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

下面是一個使用位反射得到一個版本的好方法包含特定類的DLL:

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

只需更換!Class!用您希望獲取版本的DLL中定義的類的名稱。

這是我首選的方法,因爲如果我爲不同的部署移動DLL,我不必更改文件路徑。

+2

請注意,這僅適用於所討論的程序集是由當前程序靜態引用的問題。 – staafl 2013-10-10 13:02:39

+0

這是最好的答案,因爲DLL不一定是入口程序集,甚至不是從 – 2017-10-22 23:46:59

+0

調用的程序集,請參閱https://stackoverflow.com/a/909583/492以獲取不同類型的版本信息。例如'FileVersionInfo' – 2017-10-23 00:20:06

127

如果dll是.netWin32,此工作。如果dll是.net,反射方法纔有效。此外,如果你使用反射,你有負載整個DLL到內存的開銷。下面的方法不會將程序集加載到內存中。

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

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

original source

+3

我喜歡這個。爲什麼你會打擾加載DLL,然後使用反射來獲取版本,當你真正想要做的是這個? – aggieNick02 2013-02-25 17:19:03

+1

+1非常好,正是我需要的。 – 2013-06-25 15:13:15

+0

@ben,你可以編輯帖子嗎?我看到我失去了-1代表加入downvote,我不記得做。它不會讓我改變它,除非你編輯帖子。乾杯! – 2014-08-21 09:35:32

36

首先,有兩種可能的 '版本',你可能有興趣

  • 的Windows文件系統文件的版本,適用到所有可執行文件

  • 程序集構建版本,由編譯器嵌入到.NET程序集中(顯然只適用於。NET程序集DLL和EXE文件)

在前一種情況下,你應該使用本安德森的答案;在後一種情況下,請使用AssemblyName.GetAssemblyName(@"c:\path\to\file.dll").Version或Tataro的答案,以防程序集引用該程序集。

請注意,您可以忽略使用.Load()/.LoadFrom()方法的所有答案,因爲這些方法實際上將程序集加載到當前的AppDomain中 - 這與裁減樹來查看它的年齡有些類似。

+8

+1這是比我的更優的答案。 – Kris 2013-10-11 12:40:27

相關問題