来自命令行的汇编版本?

问题描述 投票:0回答:11

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

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

dll visual-studio-2010 assemblies version
11个回答
109
投票

这是 PowerShell 的闪光点。如果您还没有它,请安装它。它预装了 Windows 7。

运行此命令行:

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

输出:

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

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


21
投票

如果您使用 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));
            }
        }
    }
}

8
投票

在 Powershell 中

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

4
投票

我使用所选的答案,直到出现以下错误

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

应该适用于这些情况(可能是所有情况)


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


0
投票

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

filever /V YourDllName.dll

0
投票

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

获取“FullName”等扩展属性

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

0
投票

如果想要查看版本,我们可以使用以下命令

ildasm "<your assembly path>"  /TEX | find "AssemblyFileVersionAttribute"

这将返回一个如下所示的字符串 .custom 实例 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

评论里给出了版本。


0
投票

我在

Windows PowerShell
中使用了接受的答案,但是使用
Powershell 7
(pwsh)接受的答案失败了,如下:

[System.Reflection.Assembly]::LoadFrom($(Get-Location).Path + "\MyApp\bin\Debug\MyApp.exe").GetName().Version.ToString()
MethodInvocationException: Exception calling "LoadFrom" with "1" argument(s): "Could not load file or assembly 'C:\Users\user\work\repo\MyApp\bin\Debug\MyApp.exe'. Format of the executable (.exe) or library (.dll) is invalid."

在阅读了此 Reddit 帖子上的评论后,我拼凑了一个替代方案。

[System.Reflection.AssemblyName]::GetAssemblyName($(Get-Location).Path + "\MyApp\bin\Debug\MyApp.exe").Version.ToString()
3.1.9120.17056

具体来说

[System.Reflection.Assembly]::LoadFrom()
正在加载到 PowerShell 正在运行的 .NET 环境中 - 即除非它们兼容,否则它将无法加载。

考虑到

LoadFrom()
意味着加载准备从中运行代码,然后我们只需查询
GetName()
并将其丢弃。 另一种形式只是查询元数据以获取名称,而无需通过
[System.Reflection.AssemblyName]::GetAssemblyName()
加载。


-3
投票

您使用GACUTIL吗?

您可以通过下面的命令获取程序集版本。

C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\gacutil.exe /L "<your assembly name>"
© www.soinside.com 2019 - 2024. All rights reserved.