Я думаю, что самое близкое, что вы можете получить, это определить, какая версия CLR требуется. Вы можете сделать это, используя ILDASM и просматривая узел «MANIFEST» или Reflector и просматривая представление «disasembly» узла «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% надежному, но я не думаю, что это скоро изменится.