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

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

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

(Пока я пробовал ILDASM и DUMPBIN безуспешно.)


person Sam    schedule 28.11.2008    source источник
comment
См. Также stackoverflow.com/questions/3460982/   -  person Ruben Bartelink    schedule 22.03.2011
comment
docs.microsoft.com/en-us/sysinternals/downloads - Process Explorer делает это очень хорошо и легко в использовании, просто запустите его от имени администратора.   -  person AquaAlex    schedule 19.08.2019


Ответы (10)


Я думаю, что самое лучшее, что вы можете получить с уверенностью, - это определить, какая версия 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% надежным, но не думаю, что в ближайшее время это изменится.

person Scott Dorman    schedule 28.11.2008
comment
К сожалению, Microsoft вносит критическое изменение в описанный выше метод. Сборки .NET 4.5 не могут работать на чистом .NET 4, и чтобы сообщить сборке .NET 4.5, вам также необходимо прочитать System.Runtime.Versioning.TargetFrameworkAttribute. lextm.com/2013/02/ how-to-tell-net-45-only-assemblies.html - person Lex Li; 14.04.2013

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

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

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

person Asain Kujovic    schedule 24.10.2016
comment
Это здорово, особенно если у вас нет доступа к декомпиляции / другим инструментам. - person Craig; 12.09.2017
comment
Обновление: его может не найти, а вместо него может быть .NETStandard, версия = ... - person Thought; 12.07.2021

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

См. Панель свойств:  введите описание изображения здесь

person Daniel A. White    schedule 25.10.2011

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

[assembly: TargetFramework(".NETFramework,Version=v4.5", FrameworkDisplayName = ".NET Framework 4.5")]
person tsandhol    schedule 11.06.2013
comment
Обратите внимание, что TargetFrameworkAttribute был добавлен только в. NET 4.0, поэтому не будет присутствовать в сборках, скомпилированных для .NET 3.5 или более ранней версии. - person Wai Ha Lee; 28.09.2018
comment
ILSpy показывает Runtime: vXXX в комментариях при щелчке корневого узла загруженной сборки. Мне удалось увидеть фреймворк v1.1.4322. - person ryancdotnet; 01.12.2018

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

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

person Andrew Hare    schedule 24.11.2009
comment
Это не правильно. OP спросил о версии .NET Framework, а не о версии среды выполнения CLR. Этот ответ касается последнего. В качестве примера я использую Framework 4.7.2531.0, в котором используется среда выполнения CLR версии 4.0.30139. ImageRuntimeVersion возвращает версию CLR, а не версию Framework. - person Tom Baxter; 24.08.2017

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

person Sean B    schedule 03.02.2017

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

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

person Vince Fedorchak    schedule 06.04.2012
comment
Невозможно различить .Net4 и .Net4.5 - person mheyman; 27.02.2014

Вы можете получить .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.

person Mark Walker    schedule 27.03.2020
comment
У меня это не сработало. Я скопировал и вставил все в PowerShell, изменив свой путь на путь exe, и он просто сообщает мне имя приложения, больше ничего - person edo101; 29.01.2021

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

person Denis    schedule 18.01.2013
comment
Не думаю, что это правда. У меня целевая платформа 4.5, но я использую System.Core 4.0.XXX.XXX - person Paul Totzke; 02.02.2016

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

strings that_app.exe | grep 'v2.\|Framework'
person Pierz    schedule 02.11.2017