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



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



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



(до сих пор я пробовал ILDASM и команду dumpbin без каких-либо удачи.)

646   9  

9 ответов:

Я думаю, что ближе всего вы можете надежно получить, чтобы определить, какая версия CLR это. Вы можете сделать это, используя ILDASM и глядя на узел "манифест" или отражатель и глядя на представление dissasembly приложения.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, глядя на данные узла "манифеста":

.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
}

и с помощью рефлектора, глядя на dissambly (все еще как IL) для каждой ссылки в списке:

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

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

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

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

любой другой редактор / просмотрщик также может открывать двоичные файлы, такие как Notepad++ или totalcommander's great text/hex viewer Листер.

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

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

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

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

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

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

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

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

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

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

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

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

Comments

    Ничего не найдено.