使用三十年历史、大小为200kb、预装工具 Notepad:
notepad appname.exe
打开应用程序,framework
,F3
重复上次搜索,直到出现 .NET Framework,version=vX.Y
。v2.
……这比安装几个GB的.NET分析工具和垃圾工作室简单了100倍。更新:在评论中,Thought 和 Marcus 建议搜索术语也可以是 netstandard
或 netframework
。
.NETFramework,Version = v4.7.2
。 - Marcus我认为你可以可靠地确定所需的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 工具,查看列出的每个引用的反汇编(仍为 IL 代码):
.assembly extern System.Core
{
.ver 3:5:0:0
.publickeytoken = (B7 7A 5C 56 19 34 E0 89)
}
通过查找具有最高版本元数据的引用,您可以确定该引用来自哪个版本的框架,这将表明您需要安装相同版本的框架才能运行应用程序。话虽如此,我不认为这是100%可靠的,但我认为它不会很快改变。
[assembly: TargetFramework(".NETFramework,Version=v4.5", FrameworkDisplayName = ".NET Framework 4.5")]
// 架构:x64 // 运行时:.NET 4.0
- ZoliFrom the command line: find "Framework" MyApp.exe
PresentationFramework
。 - Zoli你可以使用 Assembly.ImageRuntimeVersion
来获取版本信息,但是最好的做法可能是使用 Reflector 工具查看引用了哪个版本的 mscorlib
。
编辑:更好的方法是使用ILDASM,打开程序集并查看程序集清单。清单的第一行将告诉您程序集针对哪个版本的 CLR 构建。
$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文件也会执行相同的操作。
ReflectionOnlyLoadFrom
替换为 LoadFile
。 - mklement0或者你可以找出它引用的System.Core版本。这将告诉你这个应用程序使用的.NET Framework版本。对于2.0,System.Core的版本将是2.0.xxx.xxx。对于3.5,版本将是3.5.xxx.xxx等。
strings that_app.exe | grep 'v2.\|Framework'