У меня есть исполняемый файл, и я хотел бы знать, какие версии Microsoft .NET Framework необходимо запустить.
Есть ли простой способ где-нибудь найти эту информацию?
У меня есть исполняемый файл, и я хотел бы знать, какие версии Microsoft .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 lister.
Более упрощенный подход - использовать dotPeek и посмотреть, что отображается в дереве.
Теперь вы можете использовать ILSpy для проверки целевой структуры сборки. После загрузки сборки щелкните корень узла сборки, и вы сможете найти информацию в объявлении TargetFramework:
[assembly: TargetFramework(".NETFramework,Version=v4.5", FrameworkDisplayName = ".NET Framework 4.5")]
Из кода вы можете использовать Assembly.ImageRuntimeVersion
, но посмотрев в файле, вероятно, лучше всего было бы использовать отражатель и посмотреть, на какую версию mscorlib
ссылаются.
Изменить: Еще лучше было бы использовать ildasm, откройте свою сборку и просмотрите манифест сборки. Первая строка манифеста сообщит вам точную версию CLR, для которой была создана сборка.
Из командной строки: find "Framework" MyApp.exe
Вы можете использовать инструмент под названием 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 и т. Д.
В Linux / OSX / unix вы можете использовать:
strings that_app.exe | grep 'v2.\|Framework'