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

StackOverflow https://stackoverflow.com/questions/325918

  •  11-07-2019
  •  | 
  •  

Вопрос

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

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

(До сих пор я пробовал ИЛДАСМ и МУСОРНАЯ БИНА без всякой удачи.)

Это было полезно?

Решение

Я думаю, что самое близкое, что вы можете получить, это определить, какая версия среда CLR требуется.Вы можете сделать это, используя ILDASM и просмотрев узел «MANIFEST» или Reflector и просмотрев представление дизассемблирования узла «Application.exe» как IL.В обоих случаях имеется комментарий, указывающий версию CLR.В ILDASM комментарий — «// Версия метаданных», а в Reflector — «Целевая версия времени выполнения».

Ниже приведены примеры приложения .NET WinForms с именем WindowsFormsApplication1.exe:

ИЛДАСМ:

// 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 появляется
  • если ничего не найдено (версии ниже 3.0) ищите 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 модуля, поэтому не используйте какие-либо флаги, пока не прочитаете документация .

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

Или вы можете просто узнать, какая ссылка на 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'
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top