Просто несколько указателей на то, что нужно, я сомневаюсь, что вы будете преследовать это, когда узнаете, что нужно.
Отправной точкой является написание кода, который перечисляет все файлы EXE и DLL на ваших дисках. Для каждого найденного файла сначала нужно проверить, действительно ли это управляемая программа. Затем вам нужно снять номер версии метаданных из заголовка COR. Указывает, к какой версии CLR был создан исполняемый файл. Общие значения: 2.0.50727 для .NET 2.0, 3.0 и 3.5, 4.0.30319 для .NET 4.0, я не знаю номеров для .NET 1.x
Далее вам необходимо использовать Assembly.GetReferencedAssemblies (), чтобы узнать, от каких сборок .NET он зависит. Вам нужно будет создать свой собственный индекс сборок, которые присутствуют в 2.0, 3.0, 3.5 и его пакетах обновления. Это позволяет узнать, какая конкретная версия необходима.
Далее необходимо проанализировать любой файл .config, который может присутствовать для EXE, и проверить элементы <requiredRuntime>
и <supportedRuntime>
. Последний атрибут является хитрым, поскольку он может появляться более одного раза.
Вероятно, есть некоторые вещи, которые я пропустил, такие как сборки издателя и bindingRedirects. Используйте исходный код ildasm.exe в SSCLI20, чтобы получить трещину при чтении номера версии метаданных. Выигрыш для такого инструмента невелик. Сегодня, когда один терабайтный накопитель продается за сотню долларов, потенциальная экономия такого инструмента составляет около 4 центов.