У меня есть исполняемый файл, и я хотел бы знать, какие версии .NET framework этот файл нужно запустить.
Есть ли простой способ где-нибудь найти эту информацию?
Ответы:
Я думаю, что самое надежное, что вы можете получить, это определить, какая версия CLR требуется. Вы можете сделать это, используя ILDASM и глядя на узел «MANIFEST» или Reflector и просматривая представление разборки узла «Application.exe» как IL. В обоих случаях есть комментарий, указывающий версию CLR. В ILDASM комментарий - «// Версия метаданных», а в Reflector - «Целевая версия времени выполнения».
Вот примеры для приложения .NET WinForms с именем WindowsFormsApplication1.exe:
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)
}
Найдя ссылку с метаданными наивысшей версии, вы можете определить, из какой версии Framework эта ссылка пришла, что будет означать, что вам нужна такая же версия Framework, установленная для запуска приложения. При этом я бы не стал считать это 100% надежным, но не думаю, что в ближайшее время это изменится.
Используя Блокнот , три десятилетия назад, размер 200 КБ, предустановленный инструмент:
notepad appname.exe
, F3
пока не .NET Framework,version=vX.Y
появитсяv2.
... все равно в 100 раз проще, чем установка гигабайт инструментов анализатора точечных сетей и студий мусора.Любой другой редактор / программа просмотра также может открывать двоичные файлы, например Notepad ++ или отличный список текстовых / шестнадцатеричных программ просмотра totalCommander .
Более упрощенный подход - использовать dotPeek и смотреть, что отображается в дереве.
Теперь вы можете использовать ILSpy для проверки целевой платформы сборки. После загрузки сборки щелкните корень узла сборки, и вы сможете найти информацию в объявлении TargetFramework:
[assembly: TargetFramework(".NETFramework,Version=v4.5", FrameworkDisplayName = ".NET Framework 4.5")]
Из кода, который вы можете использовать, Assembly.ImageRuntimeVersion
но, посмотрев на файл, вероятно, лучше всего было бы использовать рефлектор и посмотреть, на какую версию mscorlib
ссылается.
Изменить: еще лучше было бы использовать ildasm , открыть свою сборку, а затем просмотреть манифест для сборки. Первая строка манифеста сообщит вам точную версию CLR, для которой была создана сборка.
Вы можете использовать инструмент под названием CorFlags.exe. Он существует с .NET 2.0, и я точно знаю, что он включен в Windows SDK 7.0. По умолчанию (в Windows XP Pro) он устанавливается в C: \ Program Files \ Microsoft SDKs \ Windows \ v7.0A \ bin \ CorFlags.exe. Укажите путь к управляемому модулю (без каких-либо других флагов командной строки), чтобы отобразить информацию заголовка, включая версию.
Помните, что эта утилита предназначена для изменения заголовка PE32 модуля, поэтому не используйте какие-либо флаги, пока вы внимательно не прочитаете документацию .
Вы можете получить .NET-версию файла в Windows с помощью Powershell. Следующий скрипт;
$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"
}
Обратите внимание, что в результате была извлечена версия .NET для exe-файлов в этой папке, но он также будет делать то же самое для dll.
Или вы можете просто узнать, какая ссылка на System.Core у него есть. Это покажет вам версию .NET Framework, которую использует это приложение. Для 2.0 версия System.Core будет 2.0.xxx.xxx. Для 3.5 версия будет 3.5.xxx.xxx и т. Д.