当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《以编程方式获取DLL的版本号》经验,为你挑选了6个好方法。

是否可以从任何.NET DLL以编程方式获取版本号?

如果有,怎么样?



1> Ben Anderson..:

如果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

原始来源


如果你想确保你当前正在使用的可执行文件/ dll:而不是静态文件名(`@"C:\ MyAssembly.dll"`上面),你可以使用`System.Reflection.Assembly.GetExecutingAssembly( ).Location`(或者如果是一个dll:`Assembly.GetAssembly(typeof(AClassInTheDll)).位置`)
我喜欢这个.你为什么要费心加载dll然​​后使用反射来获取版本,当你真正想做的就是这个?
这是AssemblyVersion和AssemblyFileVersion属性之间的区别.AssemblyFileVersion会以Windows API可以获取值的方式加盖标记.AssemblyVersion是强名称的一部分,不一定与AssemblyFileVersion相同.

2> Kris..:
Assembly assembly = Assembly.LoadFrom("MyAssembly.dll");
Version ver = assembly.GetName().Version;

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


这会将MyAssembly.dll加载到正在运行的AppDomain中......糟糕的主意.
我建议使用`Assemblyname.GetAssemblyName`来避免这些问题
将程序集加载到appdomain是缓慢的,不可逆转的(你不能在不杀死域的情况下卸载它),需要权限并且容易引起副作用,例如执行`beforefieldinit`类型的初始化程序,并且在这种情况下不需要.这些原因听起来不够吗?
@staafl:是的; 不仅适合我,也适用于将来阅读此页面的所有人.
`FileVersionInfo.GetVersionInfo("foo.dll").FileVersion`完成了这项工作,并没有将dll加载到应用程序中.
@staafl:我觉得这很可能是OP想要的.如果没有,还有"Assembly.ReflectionOnlyLoadFrom",请参阅http://msdn.microsoft.com/en-us/library/system.reflection.assembly.reflectiononlyloadfrom.aspx

3> staafl..:

首先,您可能感兴趣的有两个可能的"版本":

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

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

在前一种情况下,你应该使用Ben Anderson的答案; 在后一种情况下,使用AssemblyName.GetAssemblyName(@"c:\path\to\file.dll").Version或Tataro的答案,以防您的代码引用程序集.

请注意,您可以忽略使用.Load()/ .LoadFrom()methods的所有答案,因为这些答案实际上会在当前AppDomain中加载程序集 - 这类似于剪切树以查看它的年龄.


+1这是一个比我更好的答案.

4> Totero..:

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

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

只需更换!Class!与您希望获得的版本的DLL中定义的类的名称.

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


请注意,这仅在有问题的程序集由当前程序静态引用时才有效.
这是最佳答案,因为DLL不一定是入口程序集,甚至不是从中调用的程序集

5> Agent_9191..:

为启动的程序集(winform,console app等)获取它...

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


GetExecutingAssembly()也可能有所帮助.

6> MacSpudster..:

Kris,你的版本在需要从实际的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)

推荐阅读
ifx0448363
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有