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


97

У мене є виконуваний файл, і я хотів би знати, які версії .NET Framework потрібно запускати цей файл.

Чи є простий спосіб десь знайти цю інформацію?

(Поки що я пробував ILDASM та DUMPBIN без удачі.)



docs.microsoft.com/en-us/sysinternals/downloads - Process Explorer робить це дуже добре та зручно у використанні, просто запустіть це як адміністратор
AquaAlex

Відповіді:


55

Я думаю, що найближче, що ви можете надійно отримати, це визначити, яка версія 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, дивлячись на незрозуміле (все ще як ІЛ) для кожного перерахованого посилання:

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

Знайшовши посилання з метаданими найвищої версії, ви можете визначити, з якої версії Framework походить це посилання, що означало б, що вам потрібна та сама версія Framework, встановлена ​​для запуску програми. Зважаючи на це, я б не ставлюсь до цього як до 100% надійного, але я не думаю, що це скоро зміниться.


4
На жаль, корпорація Майкрософт вносить важливі зміни для вищезазначеної техніки. Збірки .NET 4.5 не можуть працювати на вихідному .NET 4, і, щоб повідомити збірку .NET 4.5, вам також потрібно прочитати System.Runtime.Versioning.TargetFrameworkAttribute. lextm.com/2013/02/how-to-tell-net-45-only-assemblies.html
Лекс Лі

56

Використовуючи Блокнот , три десятиліття, розміром 200 Кб, попередньо встановленим інструментом:

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

Будь-який інший редактор / переглядач також може відкривати двійкові файли, як, наприклад, блокнот ++ або чудовий список текстових / шестигранних переглядачів totalCommander .


Це чудово - особливо якщо у вас немає доступу до декомпіляції / інших інструментів
Крейг,

@BentTranberg цікаво, чи можете ви надіслати мені exe якось, asainnp в gmail com.
Asain Kujovic

32

Більш спрощеним підходом було б використовувати dotPeek і подивитися, що відображається на дереві.

Дивіться панель властивостей: введіть тут опис зображення


22

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

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

2
Зверніть увагу, що TargetFrameworkAttribute було додано лише у .NET 4.0, тому він не буде присутній у збірках, скомпільованих проти .NET 3.5 або раніше.
Wai Ha Lee

ILSpy показує "Runtime: vXXX" у коментарях при натисканні на завантажений кореневий вузол збірки. Я зміг побачити фреймворковий проект v1.1.4322.
ryancdotnet

15

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

Редагувати: Ще краще було б використовувати ільдазм , відкрити свою збірку, а потім переглянути маніфест для збірки. Перший рядок маніфесту розкаже точну версію CLR, для якої складено збірку.


3
Це неправильно. ОП запитала про версію .NET Framework, а не версію виконання CLR. Ця відповідь стосується останнього. Як приклад, я працюю проти Framework 4.7.2531.0, який використовує CLR Runtime версії 4.0.30139. ImageRuntimeVersion повертає CLR-версію, а не версію Framework.
Том Бакстер

11

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

Майте на увазі, що ця утиліта призначена для модифікації заголовка PE32 модуля, тому не використовуйте жодного з прапорів, поки ви уважно не прочитаєте документацію .


1
Не вдається розрізнити .Net4 та .Net4.5
mheyman


2

Або ви можете просто дізнатися, яке посилання на System.Core воно має. Це покаже вам версію .NET Framework, яку використовує цей додаток. Для 2.0 версія System.Core буде 2.0.xxx.xxx. Для версії 3.5 версія буде 3.5.xxx.xxx тощо.


Я не думаю, що це правда. У мене цільовий фреймворк 4.5, але використовую System.Core 4.0.XXX.XXX
Пол Тотке

2

Ви можете отримати .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.


1

У Linux / OSX / unix ви можете використовувати:

strings that_app.exe | grep 'v2.\|Framework'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.