【问题标题】:Assembly version from command line?命令行的汇编版本?
【发布时间】:2011-03-03 11:52:29
【问题描述】:

是否有 Microsoft 工具可以从命令行获取 DLL 文件的汇编版本?

(我知道我可以编写自己的工具。)

【问题讨论】:

    标签: dll visual-studio-2010 assemblies version


    【解决方案1】:

    这是 PowerShell 大放异彩的领域。如果您还没有它,请安装它。它预装了 Windows 7。

    运行这个命令行:

    [System.Reflection.Assembly]::LoadFrom("C:\full\path\to\YourDllName.dll").GetName().Version
    

    输出这个:

    Major  Minor  Build  Revision
    -----  -----  -----  --------
    3      0      8      0
    

    请注意,LoadFrom 返回一个程序集对象,因此您几乎可以做任何您喜欢的事情。无需编写程序。

    【讨论】:

    • 我希望它能够类似地工作。但是,我的测试失败了,并显示一条错误消息,指出混合模式程序集的运行时版本比加载的版本新 - 不知道如何规避这一点。
    • 要仅获取版本号,请将.ToString() 附加到末尾,例如[System.Reflection.Assembly]::LoadFrom("YourDllName.dll").GetName().Version.ToString()
    • 好答案。问:我如何在 Visual Studio 的外部工具中使用它(工具 -> 外部工具...)?
    • 对此解决方案的一些注意事项。 1) 它采用 DLL 的完整路径。示例中的相对路径不起作用。 2)它将程序集标记为“正在使用”,这会阻止它被替换,直到您退出该 powershell 进程。这可能会阻止构建或删除文件夹等。要解决这个问题,要么在脚本中执行此操作,要么先再次调用“powershell”,然后在完成后退出该子进程 powershell。
    • 对于 Windows 10 上的我来说,它无法识别双引号,并报告 Missing ')' in method call 然后抱怨文件名。但是,它可以正常工作,使用单引号。此外,在带有单引号的 Windows 10 上,它将接受相对路径。
    【解决方案2】:

    对于像我这样寻找这种工具的人:

    using System;
    using System.IO;
    using System.Reflection;
    
    class Program
    {
        public static void Main(string[] args)
        {
            foreach (string arg in args)
            {
                try
                {
                    string path = Path.GetFullPath(arg);
                    var assembly = Assembly.LoadFile(path);
                    Console.Out.WriteLine(assembly.GetName().FullName);
                }
                catch (Exception exception)
                {
                    Console.Out.WriteLine(string.Format("{0}: {1}", arg, exception.Message));
                }
            }
        }
    }
    

    【讨论】:

    • 这样的短代码在作为脚本保存时是最好的(也是最容易维护的)。我强烈推荐 cs-script 项目来实现这一点。
    • 有没有办法使用它来获取批处理文件变量中的输出?
    • @NickG,您可以(误)使用窗口批处理中的for 语句将输出读入变量。例如,for /f %%a in ('time /t') do ( set currentTime=%%a ) 会将时间读入循环内的%%a,然后将其设置为%currentTime%,以便您随后使用它。
    【解决方案3】:

    考虑到诸如旧的可利用 gdiplus.dll 之类的东西,这太糟糕了。

    我的解决方案很简单。批处理文件编程。

    这会将 nfo 文件与版本放在同一目录中

    您可以获取 filever.exe,它可以作为 Windows XP SP2 支持工具包的一部分下载 - 仅 4.7MB 的下载量。

    adobe_air_version.bat

    c:\z\filever.exe /A /D /B "C:\Program Files\Common Files\Adobe AIR\Versions\1.0\Adobe AIR.dll" >000_adobe_air.dll_VERSION.nfo
    
    exit
    

    变化。

    将目录中的所有版本获取到文本文件中。

    c:\z\filever.exe /A /D /B "c:\somedirectory\ *.dll *.exe >000_file_versions.nfo
    
    exit
    

    还有 systernals 的 Sigcheck。

    http://technet.microsoft.com/en-us/sysinternals/bb897441.aspx

    【讨论】:

    • SigCheck 非常好,但它不显示 AssemblyVersion。
    【解决方案4】:

    文件版本工具会有所帮助:

    filever /V YourDllName.dll
    

    【讨论】:

    • 这是什么,在哪里?
    • 在Windows XP Service Pack 2 Support Tools。但是,这只能安装在 XP 系统上。因此,要获取 Win7/8 的文件,请使用 7-Zip 之类的工具“解压缩”安装 exe。提取里面的“support.cab”文件。再一次,使用 7-Zip 解压这个 CAB,你可以得到“filever.exe”。
    【解决方案5】:

    如果你使用 mono 和 linux,试试这个:

    monodis --assembly MyAssembly.dll
    
    find . -name MyAssembly.dll -exec monodis --assembly {} ';' | grep Version 
    

    【讨论】:

      【解决方案6】:

      你使用GACUTIL吗?

      您可以从下面的这个命令中获取程序集版本。

      C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\gacutil.exe /L "<your assembly name>"
      

      【讨论】:

      • /l [ ] 列出全局程序集缓存的内容。当指定可选的 参数时,仅列出匹配的程序集。
      • 如果我有本地程序集,这对我不起作用,例如在 NUGET 包中。 Gacutil 仅适用于 GAC 中的程序集。
      【解决方案7】:

      在 Powershell 中

      $version = [System.Diagnostics.FileVersionInfo]::GetVersionInfo("filepath.exe").FileVersion.ToString()
      

      【讨论】:

      • FileVersion 与 AssemblyVersion 不同
      【解决方案8】:

      我使用了选择的答案,直到出现以下错误 Reference assemblies should not be loaded for execution. They can only be loaded in the Reflection-only loader context. 用于多个程序集

      使用

      [System.Reflection.Assembly]::ReflectionOnlyLoadFrom("C:\full\path\to\YourDllName.dll").GetName().Version
      

      应该在这些情况下工作(可能所有情况)

      【讨论】:

        【解决方案9】:

        在其他类似 powershell 的答案中添加一些糖...

        获取扩展属性,例如“FullName”

        $dllPath = "C:\full\path\to\YourDllName.dll";
        $ass  = [System.Reflection.Assembly]::LoadFrom($dllPath);
        $ass.GetName();
        $ass
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-07-08
          • 1970-01-01
          • 1970-01-01
          • 2022-01-19
          • 2011-04-10
          • 1970-01-01
          • 2010-12-09
          相关资源
          最近更新 更多