2009-11-18 74 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

相关问题