У меня есть исполняемый файл, и я хотел бы знать, какие версии .NET Framework необходимо запустить.
Есть ли простой способ найти эту информацию где-нибудь?
У меня есть исполняемый файл, и я хотел бы знать, какие версии .NET Framework необходимо запустить.
Есть ли простой способ найти эту информацию где-нибудь?
Я думаю, что самое близкое, что вы можете получить, это определить, какая версия CLR требуется. Вы можете сделать это, используя ILDASM и посмотрев на "МАНИФЕСТ" node или отражатель и посмотрев на разборный вид "Application.exe" node как IL. В обоих случаях есть комментарий, который указывает версию CLR. В ILDASM комментарий "//версия метаданных", а в Reflector комментарий - "Target Runtime Version".
Вот примеры для приложения .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, глядя на данные "МАНИФЕСТ" node:
.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, глядя на disambly (все еще как IL) для каждой ссылки:
.assembly extern System.Core
{
.ver 3:5:0:0
.publickeytoken = (B7 7A 5C 56 19 34 E0 89)
}
Найдя ссылку с метаданными с наивысшей версией, вы можете определить, какая версия Framework, на которую ссылается ссылка, которая указала бы, что вам нужна та же самая версия Framework, которая установлена для запуска приложения. Это, как говорится, я бы не считал это на 100% надежным, но я не думаю, что он скоро изменится.
Более упрощенный подход - использовать dotPeek и посмотреть, что отображается в дереве.
Теперь вы можете использовать ILSpy для проверки целевой структуры сборки. После загрузки сборки щелкните корень сборки node, и вы можете найти информацию в объявлении TargetFramework:
[assembly: TargetFramework(".NETFramework,Version=v4.5", FrameworkDisplayName = ".NET Framework 4.5")]
Используя Notepad, три десятилетия назад, размер 200 КБ, предустановленный инструмент:
notepad appname.exe
,F3
, пока .NET Framework,version=vX.Y
не появитсяv2.
... еще в 100 раз проще, чем установка гигабайт сетевых анализаторов и мусорных студий.Любой другой редактор/просмотрщик также может открывать двоичные файлы, например Notepad ++ или totalCommander, отличный текстовый/шестнадцатеричный просмотр lister.
Из кода вы можете использовать Assembly.ImageRuntimeVersion
, но, глядя на файл, вероятно, лучше всего будет использовать отражатель и посмотреть, какие версии mscorlib
.
Изменить: Еще лучше было бы использовать ildasm, открыть сборку, а затем просмотреть манифест для сборки, Первая строка манифеста сообщит вам точную версию CLR, для которой была создана сборка.
Вы можете использовать инструмент CorFlags.exe. Он работает с .NET 2.0, и я точно знаю, что он включен в Windows SDK 7.0. По умолчанию (в Windows XP Pro) он устанавливается в C:\Program Files\Microsoft SDK\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'