如何确定可执行文件需要运行.NET Framework的哪个版本?
我有一个可执行文件,我想知道需要启动该文件的Microsoft.NET Framework的哪个版本 有没有一种简单的方法可以在某处找到这些信息如何确定可执行文件需要运行.NET Framework的哪个版本?,.net,version,executable,.net,Version,Executable,我有一个可执行文件,我想知道需要启动该文件的Microsoft.NET Framework的哪个版本 有没有一种简单的方法可以在某处找到这些信息 (到目前为止,我已经尝试过了,但没有任何运气。)我认为最可靠的方法是确定需要什么版本的CLR。您可以通过使用ILDASM并查看“MANIFEST”节点或反射器,以及将“Application.exe”节点的dissasembly视图视为IL来实现这一点。在这两种情况下,都有一条注释指示CLR版本。在ILDASM中,注释为“//元数据版本”,在Refle
(到目前为止,我已经尝试过了,但没有任何运气。)我认为最可靠的方法是确定需要什么版本的CLR。您可以通过使用ILDASM并查看“MANIFEST”节点或反射器,以及将“Application.exe”节点的dissasembly视图视为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查看“清单”节点数据:
.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
}
使用反射器,查看列出的每个参考的偏差(仍为IL):
.assembly extern System.Core
{
.ver 3:5:0:0
.publickeytoken = (B7 7A 5C 56 19 34 E0 89)
}
通过查找具有最高版本元数据的引用,您可以确定引用来自哪个版本的框架,这表明您需要安装相同版本的框架才能运行应用程序。也就是说,我不会认为这是100%可靠的,但我认为它不会很快改变。从您可以使用的代码,但通过查看文件,最好的做法可能是使用reflector,查看引用的是哪个版本的mscorlib
编辑:更好的方法是使用,打开程序集,然后查看程序集的清单。清单的第一行将告诉您构建程序集的CLR的确切版本。更简化的方法是使用并查看树中显示的内容 请参见“属性”面板:
您可以使用名为CorFlags.exe的工具。它从.NET2.0开始就存在了,我确信它包含在WindowsSDK7.0中。默认情况下(在Windows XP Pro上),它安装到C:\Program Files\Microsoft SDK\Windows\v7.0A\bin\CorFlags.exe。为其提供托管模块的文件路径(不带任何其他命令行标志),以显示其标头信息,其中包括版本
请记住,此实用程序旨在修改模块的PE32标头,因此在仔细阅读之前,不要使用任何标志。或者您只需找出它具有哪个System.Core引用即可。这将告诉您此应用程序正在使用的.NET Framework版本。对于2.0,System.Core的版本将为2.0.xxx.xxx。对于3.5,版本将是3.5.xxx.xxx等。您现在可以使用它来检查程序集的目标框架。加载程序集后,单击程序集节点的根节点,可以在TargetFramework声明下找到信息:
[assembly: TargetFramework(".NETFramework,Version=v4.5", FrameworkDisplayName = ".NET Framework 4.5")]
使用30年前预装的200kb大小的工具:
- 使用记事本appname.exe打开应用程序
- 搜索“框架”一词
- 使用
重复上一次搜索,直到显示F3
.NET Framework,version=vX.Y
- 如果未找到任何内容(低于3.0的版本),请搜索
。。。比安装千兆字节的网络分析仪工具和垃圾工作室要容易100倍v2.
任何其他编辑器/查看器也可以打开二进制文件,如记事本++或totalCommander的伟大文本/十六进制查看器。从命令行:
查找“Framework”MyApp.exe
在Linux/OSX/unix上,您可以使用:
strings that_app.exe | grep 'v2.\|Framework'
您可以使用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也会这样做。另请参见--Process Explorer做得很好,使用起来很方便,只需在Microsoft为上述技术引入突破性更改时运行它即可。NET 4.5程序集无法在原始.NET 4上运行,要告诉.NET 4.5程序集,还需要读取System.Runtime.Versioning.TargetFrameworkAttribute。无法区分.Net4和.Net4.5我认为这不是真的。我的目标框架是4.5,但使用System.Core 4.0.XXX.XXX这是错误的。OP询问的是.NET Framework的版本,而不是CLR运行时的版本。这个答案是针对后者的。例如,我运行的是使用CLR运行时版本4.0.30139的Framework 4.7.2531.0。ImageRuntimeVersion返回CLR版本,而不是框架版本。这非常好,尤其是在您没有反编译/其他访问权限的情况下tools@BentTranberg有趣的是,你能尽快在gmail com上给我发送exe吗?请注意,它只添加到.NET 4.0中,因此不会出现在针对.NET 3.5或更早版本编译的程序集上单击加载的程序集根节点时,在注释中显示“Runtime:vXXX”。我能够看到v1.1.4322框架项目。这对我不起作用。我将所有内容复制并粘贴到powershell中,并将路径更改为exe路径,它只告诉我应用程序的名称,而不告诉我其他内容