从命令行获取程序集版本号?

69

有没有微软工具可以从命令行获取 DLL 文件的程序集版本?

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


这个回答解决了你的问题吗?获取当前目录及其所有子目录中DLL文件的文件版本和程序集版本 - Michael Freidgeim
还有其他人需要一个在只安装了dotnet的Linux系统上能够运行的答案吗? - SandRock
还有其他人需要一个在只安装了dotnet的Linux系统上能够运行的答案吗? - undefined
10个回答

103

这是 PowerShell 突出的领域。如果你还没有安装它,请安装。它已经预装在 Windows 7 上。

运行以下命令行:

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

输出为:

Major  Minor  Build  Revision
-----  -----  -----  --------
3      0      8      0
请注意LoadFrom返回一个程序集对象,因此您可以做任何您想做的事情。不需要编写程序。

2
我本以为它会工作得类似。然而,我的测试失败了,并显示了一个错误消息,指出混合模式程序集的运行时版本比已加载的版本更新 - 不知道如何规避这个问题。 - OregonGhost
2
要仅获取版本号,请在末尾添加.ToString(),例如[System.Reflection.Assembly]::LoadFrom("YourDllName.dll").GetName().Version.ToString() - Rich Zwaap
好的答案。问题:我如何在 Visual Studio 的外部工具(工具 -> 外部工具...)中使用它? - Matt
6
对于这个解决方案有几个注意事项。1)它需要DLL的完整路径。 示例中的相对路径将不起作用。2)它将程序集标记为“正在使用”,这会阻止替换该程序集直到退出PowerShell进程。这可能会阻止构建或删除文件夹等操作。要避免这种情况,可以在脚本中执行此操作或者先调用“powershell”一次,完成后再退出子进程的PowerShell。 - Richard P
对于我在Windows 10上,它无法识别双引号,并报告“方法调用中缺少‘)’”,然后抱怨文件名。然而,使用单引号可以正常工作。此外,在Windows 10上,使用单引号可以接受相对路径。 - GregHNZ
显示剩余2条评论

18

如果你使用的是Mono和Linux,请尝试以下方法:

monodis --assembly MyAssembly.dll

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

11

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

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项目来实现此目的。 - Piotr Owsiak
有没有办法使用这个来将输出存储到批处理文件变量中? - NickG
@NickG,你可以在Windows批处理中(滥)用for语句来读取输出到变量中。例如,for /f %%a in ('time /t') do ( set currentTime=%%a )会在循环内将时间读入%%a,然后将其设置为%currentTime%,随后您可以使用它。 - Paul Ruane

8

在Powershell中

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

4
文件版本(FileVersion)与程序集版本(AssemblyVersion)不同。 - Carl Walsh
是的,它不同了,但你可以获取软件包的实际版本。 - Mr Patience

4

我使用了选定的答案,直到出现以下错误:不能为执行加载引用程序集。它们只能在仅反射加载器上下文中加载。这个错误出现在多个程序集中。

使用

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

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

1

哇,考虑到像旧的可利用的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非常好用,但它不显示程序集版本号。 - cskwg
filever.exe是从哪里来的? - Florian Straub

0

在其他 PowerShell 风格的答案中添加一些糖...

获取扩展属性,如“FullName”

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

0

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

filever /V YourDllName.dll

这是什么?在哪里? - Brannon
它在Windows XP Service Pack 2 Support Tools中。然而,这只能安装在XP系统上。因此,要获取Win7/8的文件,请使用类似于7-Zip的工具“解压”安装exe。提取内部的“support.cab”文件。然后再次使用7-Zip解压缩此CAB,您就可以获得“filever.exe”。 - laifukang

0
如果想查看版本,我们可以使用以下命令。
ildasm "<your assembly path>"  /TEX | find "AssemblyFileVersionAttribute"

这将返回一个类似以下的字符串 .custom instance void [mscorlib]System.Reflection.AssemblyFileVersionAttribute::.ctor(string) = ( 01 00 0E 32 32 2E 38 2E 38 32 37 30 2E 31 36 35 // ...22.8.8270.165

版本号在注释中给出。


-3
你使用GACUTIL吗?
你可以通过下面的命令获取程序集版本。
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\gacutil.exe /L "<your assembly name>"

/l [ <assembly_name> ]会列出全局程序集缓存中的内容。当指定可选的<assembly_name>参数时,只会列出匹配的程序集。 - JJS
1
如果我有一个本地程序集,例如在 NUGET 包内部,那么这对我不起作用。Gacutil 仅适用于 GAC 中的程序集。 - Matt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接