如何找出可执行文件需要运行的 .NET Framework 版本?
Posted
技术标签:
【中文标题】如何找出可执行文件需要运行的 .NET Framework 版本?【英文标题】:How to find out which version of the .NET Framework an executable needs to run? 【发布时间】:2010-09-24 11:09:50 【问题描述】:我有一个可执行文件,我想知道该文件需要启动哪个版本的 Microsoft .NET Framework。
有没有一种简单的方法可以在某处找到这些信息?
(到目前为止,我尝试了ILDASM 和DUMPBIN,但没有任何运气。)
【问题讨论】:
另见***.com/questions/3460982/… docs.microsoft.com/en-us/sysinternals/downloads -- Process Explorer 做得很好,而且易于使用,只需以管理员身份运行即可 【参考方案1】:使用Notepad,三个十年前,大小200kb,预装工具:
用notepad appname.exe
打开应用程序,
搜索“框架”一词,
使用F3
重复上次搜索,直到出现.NET Framework,version=vX.Y
如果没有找到(低于 3.0 的版本)搜索 v2.
... 仍然比安装千兆字节的点网分析器工具和垃圾工作室容易 100 倍。
任何其他编辑器/查看器也可以打开二进制文件,例如 Notepad++ 或 totalCommander 的出色文本/十六进制查看器 lister。
【讨论】:
这很棒——特别是如果您无法使用反编译/其他工具 更新:可能找不到,反而可能有一个“.NETStandard,version=...”【参考方案2】:我认为您可以可靠获得的最接近的方法是确定所需的 CLR 版本。您可以通过使用 ILDASM 并查看“MANIFEST”节点或 Reflector 并将“Application.exe”节点的分解视图作为 IL 来执行此操作。在这两种情况下,都有一条注释指示 CLR 版本。在 ILDASM 中,注释是“// 元数据版本”,而在 Reflector 中,注释是“目标运行时版本”。
以下是名为 WindowsFormsApplication1.exe 的 .NET WinForms 应用程序的示例:
ILDASM:
// Metadata version: v2.0.50727
.assembly extern mscorlib
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
.ver 2:0:0:0
.assembly extern System
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
.ver 2:0:0:0
反射器:
.module WindowsFormsApplication1.exe
.subsystem 0x0002
// MVID: CA3D2090-16C5-4899-953E-4736D6BC0FA8
// Target Runtime Version: v2.0.50727
您还可以查看引用的程序集列表并查找具有最高版本号的引用。
再次,使用 ILDASM 查看“MANIFEST”节点数据:
.assembly extern System.Drawing
.publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) // .?_....:
.ver 2:0:0:0
.assembly extern System.Core
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
.ver 3:5:0:0
并使用 Reflector,查看列出的每个参考的 dissambly(仍为 IL):
.assembly extern System.Core
.ver 3:5:0:0
.publickeytoken = (B7 7A 5C 56 19 34 E0 89)
通过查找具有最高版本元数据的引用,您可以确定该引用来自哪个版本的框架,这表明您需要安装相同版本的框架才能运行应用程序。话虽如此,我不会将其视为 100% 可靠,但我认为它不会很快改变。
【讨论】:
不幸的是,Microsoft 对上述技术进行了重大更改。 .NET 4.5 程序集无法在原始 .NET 4 上运行,要告诉 .NET 4.5 程序集,您还需要阅读 System.Runtime.Versioning.TargetFrameworkAttribute。 lextm.com/2013/02/how-to-tell-net-45-only-assemblies.html【参考方案3】:更简单的方法是使用 dotPeek 并查看树中显示的内容。
查看属性面板:
【讨论】:
【参考方案4】:您现在可以使用ILSpy 检查程序集的目标框架。加载程序集后,点击程序集节点的根目录,可以在TargetFramework声明下找到信息:
[assembly: TargetFramework(".NETFramework,Version=v4.5", FrameworkDisplayName = ".NET Framework 4.5")]
【讨论】:
请注意,TargetFrameworkAttribute 仅在 .NET 4.0 中添加,因此不会出现在针对 .NET 3.5 或更早版本编译的程序集中。 ILSpy 在单击加载的程序集根节点时在 cmets 中显示“Runtime: vXXX”。我能够看到一个 v1.1.4322 框架项目。【参考方案5】:您可以从代码中使用Assembly.ImageRuntimeVersion
,但通过查看文件,最好的办法可能是使用反射器并查看引用了哪个版本的mscorlib
。
编辑: 更好的是使用ildasm,打开您的程序集,然后查看程序集的清单。清单的第一行将告诉您为该程序集构建的 CLR 的确切版本。
【讨论】:
这是错误的。 OP 询问的是 .NET Framework 的版本,而不是 CLR 运行时的版本。这个答案解决了后者。例如,我正在针对使用 CLR 运行时版本 4.0.30139 的 Framework 4.7.2531.0 运行。 ImageRuntimeVersion 返回 CLR 版本,而不是 Framework 版本。【参考方案6】:从命令行:find "Framework" MyApp.exe
【讨论】:
【参考方案7】:您可以使用名为 CorFlags.exe 的工具。它从 .NET 2.0 开始就已经存在,我确信它包含在 Windows SDK 7.0 中。默认情况下(在 Windows XP Pro 上)它安装到 C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin\CorFlags.exe。向它提供托管模块的文件路径(不带任何其他命令行标志)以显示其标头信息,其中包括版本。
请记住,此实用程序旨在修改模块的 PE32 标头,因此在仔细阅读 documentation 之前不要使用任何标志。
【讨论】:
无法区分.Net4和.Net4.5【参考方案8】:您可以使用 Powershell 在 Windows 中获取文件的 .NET 版本。以下脚本;
$path=’.\’
$ErrorActionPreference = "SilentlyContinue"
$files=Get-ChildItem -Path $path -Recurse -include *.dll,*.exe
foreach($file in $files)
$filename = $file.BaseName
$version = $([System.Reflection.Assembly]::ReflectionOnlyLoadFrom($file.FullName).GetCustomAttributesData() |
select-object -ExpandProperty ConstructorArguments |
select-object -ExpandProperty Value |
select-string -Pattern '.NET')
Write-Output "$filename,$version"
提供以下结果;
请注意,结果会为该文件夹中的 exe 文件提取 .NET 版本,但它也会为 dll 执行相同的操作。
【讨论】:
这对我不起作用。我将所有内容复制并粘贴到 powershell 中,并将路径更改为 exe 路径,它只告诉我应用程序的名称,没有别的【参考方案9】:或者你可以找出它有哪个 System.Core 引用。这将告诉您此应用正在使用的 .NET Framework 版本。对于 2.0,System.Core 的版本将为 2.0.xxx.xxx。对于 3.5,版本将为 3.5.xxx.xxx 等。
【讨论】:
我认为这不是真的。我有一个 4.5 的目标框架,但使用 System.Core 4.0.XXX.XXX【参考方案10】:在 Linux/OSX/unix 上,您可以使用:
strings that_app.exe | grep 'v2.\|Framework'
【讨论】:
以上是关于如何找出可执行文件需要运行的 .NET Framework 版本?的主要内容,如果未能解决你的问题,请参考以下文章
如何使 .NET 可执行文件在 64 位操作系统上作为 32 位进程运行?
我的 .net 核心发布的可执行文件提供了与运行代码时不同的目录路径