以编程方式获取DLL的版本号


Answers:


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

重要提示: 应该注意,这不是对原始问题的最佳答案。不要忘记在此页面上阅读更多内容。


28
这会将MyAssembly.dll加载到正在运行的AppDomain中。
2013年

12
我建议Assemblyname.GetAssemblyName避免这些问题
staafl 2013年

7
将程序集加载到appdomain中是缓慢的,不可逆的(您不能在不杀死域的情况下将其卸载),需要权限并且容易引起副作用,例如执行beforefieldinit类型初始化程序,在这种情况下就不需要这样做。这些理由听起来足够吗?
staafl 2013年

7
@staafl:是的;不仅对我来说,而且对以后阅读此页面的其他人也是如此。
克里斯(Kris)

6
FileVersionInfo.GetVersionInfo("foo.dll").FileVersion做得很好,并且不会将dll加载到应用程序中。
2015年

181

如果dll是.netWin32,则此方法有效。反射方法仅在dll为.net时有效。另外,如果使用反射,则需要将整个dll加载到内存中。下面的方法不会将程序集加载到内存中。

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

来自:http : //msdn.microsoft.com/zh-cn/library/system.diagnostics.fileversioninfo.fileversion.aspx

原始资料


5
我喜欢这个。当您真正想做的只是这个事情时,为什么还要麻烦加载dll,然后仅使用反射来获取版本?
aggieNick02

@ben,您可以编辑帖子吗?我看到我由于添加了下注而失去了-1 rep,我不记得这样做了。除非您编辑帖子,否则它不会让我更改它。干杯!
Luke Duddridge 2014年

9
如果你想确保你得到的可执行文件/ DLL实际上目前使用的:而不是静态文件名(@"C:\MyAssembly.dll"上图),你可以使用System.Reflection.Assembly.GetExecutingAssembly().Location(或者如果DLL: Assembly.GetAssembly(typeof(AClassInTheDll)).Location
康拉德

4
这是AssemblyVersion和AssemblyFileVersion属性之间的区别。以Windows API可以获取值的方式标记AssemblyFileVersion。AssemblyVersion是强名称的一部分,不一定与AssemblyFileVersion相同。
daughey

51

首先,您可能感兴趣的是两个可能的“版本”:

  • Windows文件系统文件版本,适用于所有可执行文件

  • 程序集构建版本,由编译器嵌入到.NET程序集中(显然仅适用于.NET程序集dll和exe文件)

在前一种情况下,您应该使用本·安德森的答案;在后一种情况下,AssemblyName.GetAssemblyName(@"c:\path\to\file.dll").Version如果您的代码引用了程序集,请使用或Tataro的答案。

请注意,您可以忽略所有使用.Load()/ .LoadFrom()方法的答案,因为这些方法实际上将程序集加载到当前AppDomain中-这类似于砍伐树以查看树的年龄。


32

这是使用一些反射来获取包含特定类的DLL版本的一种好方法:

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

只需替换!类!使用要获取其版本的DLL中定义的类的名称。

这是我的首选方法,因为如果我针对不同的部署移动DLL,则不必更改文件路径。


3
请注意,这仅在当前程序集静态引用了该程序集的情况下有效。
staafl 2013年

2
这是最好的答案,因为DLL不一定是入口程序集,甚至也不是所谓的入口程序集
CAD bloke

1
有关获取不同类型的版本信息,请参见stackoverflow.com/a/909583/492。例如FileVersionInfo
CAD bloke'Oct

22

为启动的程序集获取它(winform,控制台应用程序等)

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

6
GetExecutingAssembly()也可能会有所帮助。
Bolt Thunder

10

克里斯(Kris),当需要从实际的DLL文件中加载程序集时(如果DLL存在!),您的版本效果很好。但是,如果DLL被嵌入(即不是文件而是嵌入式文件),则会出现很多不必要的错误。 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)

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

2

@Ben的回答被证明对我有用。但是我需要检查产品版本,因为它是我软件中发生的主要增量,并且遵循语义版本控制。

myFileVersionInfo.ProductVersion

这种方法符合我的期望

更新:我们可以使用Assembly来获取产品版本,而不是在程序中明确提及dll路径(生产版本中需要)。

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

注意:如果版本中包含自动增加值的星号,则此方法将返回星号,而不是实际生成的数字(即,如果在装配信息中输入1.0。*,则该方法不起作用)。
罗尼·内斯

是! 但是,我选择Jeniks自动化进行版本升级,因此程序集始终具有dll版本的完美组合。
Prasan Dutt

1

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


0

虽然原始问题可能并非特定于Web服务,但是您可以添加完整的testWebService来显示Web服务非缓存的响应以及文件版本。我们使用文件版本而不是程序集版本,因为我们想知道一个版本,但是对于所有程序集版本1.0.0.0,可以轻松修补网站(签名和需求链接仍处于活动状态!)。将@ Class @替换为嵌入该服务的Web api控制器的名称。对于在Web服务上执行go / nogo以及快速进行版本检查非常有用。

  [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;
  }

我发现还需要在配置下将以下内容添加到web.config中,以使其真正匿名

<location path="api/testwebservice">
    <system.web>
        <authorization>
            <allow users="*" />
        </authorization>
    </system.web>
</location>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.