Как узнать, какую версию .NET Framework должен запускать исполняемый файл? - PullRequest
87 голосов
/ 28 ноября 2008

У меня есть исполняемый файл, и я хотел бы знать, для каких версий .NET Framework этот файл необходимо запустить.

Есть ли простой способ найти эту информацию где-нибудь?

(До сих пор я безуспешно пытался ILDASM и DUMPBIN .)

Ответы [ 9 ]

52 голосов
/ 28 ноября 2008

Я думаю, что самое близкое, что вы можете получить, это определить, какая версия CLR требуется. Вы можете сделать это, используя ILDASM и просматривая узел «MANIFEST» или Reflector и просматривая представление «disasembly» узла «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% надежному, но я не думаю, что это скоро изменится.

38 голосов
/ 24 октября 2016

Использование Блокнот , три десятилетия, размером 200 КБ, предустановленный инструмент:

  • открыть приложение с notepad appname.exe,
  • поиск по слову "framework",
  • повторять последний поиск с F3, пока не появится .NET Framework,version=vX.Y
  • если ничего не найдено (версии ниже 3.0), поиск v2. ... еще в 100 раз проще, чем установка гигабайт инструментов анализатора точек сети и сборщиков мусора.

Любой другой редактор / программа просмотра также может открывать двоичные файлы, например Notepad ++ или средство просмотра текстовых / шестнадцатеричных данных TotalCommander lister .

29 голосов
/ 25 октября 2011

Более упрощенный подход - использовать dotPeek и посмотреть, что отображается в дереве.

См. Панель свойств: enter image description here

19 голосов
/ 11 июня 2013

Теперь вы можете использовать ILSpy для проверки целевой структуры сборки. После загрузки сборки нажмите на корень узла сборки, и вы можете найти информацию в декларации TargetFramework:

[assembly: TargetFramework(".NETFramework,Version=v4.5", FrameworkDisplayName = ".NET Framework 4.5")]
15 голосов
/ 24 ноября 2009

Из кода вы можете использовать Assembly.ImageRuntimeVersion, но, посмотрев на файл, вероятно, лучше всего использовать рефлектор и посмотреть, на какую версию mscorlib ссылаются.

Редактировать: Еще лучше было бы использовать ildasm , открыть сборку и затем просмотреть манифест для сборки. Первая строка манифеста сообщит вам точную версию CLR, для которой была создана сборка.

10 голосов
/ 07 апреля 2012

Вы можете использовать инструмент под названием CorFlags.exe. Он существует с .NET 2.0, и я точно знаю, что он включен в Windows SDK 7.0. По умолчанию (в Windows XP Pro) он устанавливается в C: \ Program Files \ Microsoft SDKs \ Windows \ v7.0A \ bin \ CorFlags.exe. Укажите путь файла к управляемому модулю (без каких-либо других флагов командной строки), чтобы отобразить информацию о его заголовке, включая версию.

Имейте в виду, что эта утилита предназначена для изменения заголовка PE32 модуля, поэтому не используйте какие-либо флаги, пока внимательно не прочитаете документацию .

7 голосов
/ 04 февраля 2017

Из командной строки: find "Framework" MyApp.exe

2 голосов
/ 18 января 2013

Или вы можете просто узнать, какая ссылка на System.Core у него есть. Это скажет вам версию .NET Framework, которую использует это приложение. Для 2.0 версия System.Core будет 2.0.xxx.xxx. Для 3.5 версия будет 3.5.xxx.xxx и т. Д.

1 голос
/ 02 ноября 2017

В Linux / OSX / unix вы можете использовать:

strings that_app.exe | grep 'v2.\|Framework'
...