У мене є виконуваний файл, і я хотів би знати, які версії .NET Framework потрібно запускати цей файл.
Чи є простий спосіб десь знайти цю інформацію?
У мене є виконуваний файл, і я хотів би знати, які версії .NET Framework потрібно запускати цей файл.
Чи є простий спосіб десь знайти цю інформацію?
Відповіді:
Я думаю, що найближче, що ви можете надійно отримати, це визначити, яка версія 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% надійного, але я не думаю, що це скоро зміниться.
Використовуючи Блокнот , три десятиліття, розміром 200 Кб, попередньо встановленим інструментом:
notepad appname.exe
, F3
поки не .NET Framework,version=vX.Y
з'явитьсяv2.
... все ще в 100 разів простіше, ніж встановлювати гігабайти інструментів аналізатора точкових мереж та сміттєві студії.Будь-який інший редактор / переглядач також може відкривати двійкові файли, як, наприклад, блокнот ++ або чудовий список текстових / шестигранних переглядачів totalCommander .
Більш спрощеним підходом було б використовувати dotPeek і подивитися, що відображається на дереві.
Тепер ви можете використовувати ILSpy для вивчення цільової структури збірки. Після завантаження збірки натисніть на корінь вузла складання, і ви можете знайти інформацію під декларацією TargetFramework:
[assembly: TargetFramework(".NETFramework,Version=v4.5", FrameworkDisplayName = ".NET Framework 4.5")]
З коду, який ви можете використовувати, Assembly.ImageRuntimeVersion
але, подивившись на файл, мабуть, найкраще зробити відбивач і подивитися, на яку версію mscorlib
посилається.
Редагувати: Ще краще було б використовувати ільдазм , відкрити свою збірку, а потім переглянути маніфест для збірки. Перший рядок маніфесту розкаже точну версію 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 модуля, тому не використовуйте жодного з прапорів, поки ви уважно не прочитаєте документацію .
Або ви можете просто дізнатися, яке посилання на System.Core воно має. Це покаже вам версію .NET Framework, яку використовує цей додаток. Для 2.0 версія System.Core буде 2.0.xxx.xxx. Для версії 3.5 версія буде 3.5.xxx.xxx тощо.
Ви можете отримати .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.