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

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

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

(До сих пор я пробовал ILDASM и DUMPBIN без везения.)

Ответ 1

Я думаю, что самое близкое, что вы можете получить, это определить, какая версия CLR требуется. Вы можете сделать это, используя ILDASM и посмотрев на "МАНИФЕСТ" node или отражатель и посмотрев на разборный вид "Application.exe" node как IL. В обоих случаях есть комментарий, который указывает версию CLR. В ILDASM комментарий "//версия метаданных", а в Reflector комментарий - "Target Runtime Version".

Вот примеры для приложения .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, глядя на данные "МАНИФЕСТ" node:

.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, глядя на disambly (все еще как IL) для каждой ссылки:

.assembly extern System.Core
{
    .ver 3:5:0:0
    .publickeytoken = (B7 7A 5C 56 19 34 E0 89)
}

Найдя ссылку с метаданными с наивысшей версией, вы можете определить, какая версия Framework, на которую ссылается ссылка, которая указала бы, что вам нужна та же самая версия Framework, которая установлена ​​для запуска приложения. Это, как говорится, я бы не считал это на 100% надежным, но я не думаю, что он скоро изменится.

Ответ 2

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

Ответ 3

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

[assembly: TargetFramework(".NETFramework,Version=v4.5", FrameworkDisplayName = ".NET Framework 4.5")]

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

В командной строке: find "Framework" MyApp.exe

Ответ 8

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

Ответ 9

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

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