Я не решаюсь публиковать этот ответ, это действительно технически возможно, но на практике это не работает так хорошо. Номера версий CLR и основных сборок платформы не были изменены в 4.5. Вы по-прежнему нацелены на v4.0.30319 среды CLR, а номера версий сборки платформы по-прежнему 4.0.0.0. Единственное, что отличает манифест сборки, когда вы смотрите на него с помощью дизассемблера, такого как ildasm.exe, - это наличие атрибута [TargetFramework], который говорит, что требуется версия 4.5, которую нужно изменить. На самом деле это не так просто, это генерируется компилятором.
Самая большая разница не так заметна, Microsoft внесла давно назревшие изменения в исполняемый заголовок сборок. Указывает, с какой версией Windows совместим исполняемый файл. XP принадлежит к предыдущему поколению Windows, начатому с Windows 2000. Их основной номер версии - 5. Vista была началом текущего поколения, основной версии номер 6.
Компиляторы .NET всегда указывали минимальный номер версии 4.00, это версия Windows NT и Windows 9x. В этом можно убедиться, запустив dumpbin.exe / headers в сборке. Пример вывода выглядит так:
OPTIONAL HEADER VALUES
10B magic # (PE32)
...
4.00 operating system version
0.00 image version
4.00 subsystem version
0 Win32 version
...
Новым в .NET 4.5 является то, что компиляторы меняют версию этой подсистемы на 6.00. Изменение, которое было просрочено в значительной степени потому, что Windows обращает внимание на это число, помимо проверки того, достаточно ли оно мало. Он также включает функции appcompat, поскольку предполагает, что программа была написана для работы в старых версиях Windows. Эти функции вызывают проблемы, особенно то, что Windows лжет о размере окна в Aero. Он перестает лгать о толстых границах окна Aero, когда видит, что программа была разработана для работы в версии Windows, в которой есть Aero.
Вы можете изменить этот номер версии и установить его обратно на 4,00, запустив Editbin.exe в своих сборках с параметром / subsystem. В этом ответе показан пример события после сборки.
Однако на этом хорошие новости заканчиваются; серьезная проблема заключается в том, что .NET 4.5 не очень совместим с .NET 4.0. Безусловно, самая большая проблема заключается в перемещении классов из одной сборки в другую. В частности, это произошло с атрибутом [Extension]. Ранее в System.Core.dll он был перемещен в Mscorlib.dll в .NET 4.5. Это глупо для XP, если вы объявляете свои собственные методы расширения, ваша программа говорит искать в Mscorlib атрибут, включенный атрибутом [TypeForwardedTo] в версии .NET 4.5 эталонной сборки System.Core. Но его нет, когда вы запускаете свою программу на .NET 4.0.
И, конечно же, нет ничего, что помогло бы вам перестать использовать классы и методы, доступные только в .NET 4.5. Когда вы это сделаете, ваша программа выйдет из строя с исключением TypeLoadException или MissingMethodException при запуске на 4.0.
Просто поставьте цель 4.0, и все эти проблемы исчезнут. Или сломайте этот тупик и прекратите поддерживать XP - бизнес-решение, которое программисты не могут часто принимать, но, безусловно, могут поддержать, указав на проблемы, которые оно вызывает. Конечно, необходимость поддержки старых операционных систем требует ненулевых затрат, просто усилия по тестированию значительны. Стоимость, которую руководство не часто осознает, совместимость с Windows является легендарной, если им на это не указывают. Пересылайте эту стоимость клиенту, и он принимает правильное решение намного быстрее :) Но мы не можем вам с этим помочь.