Ответ 1
Я не решаюсь опубликовать этот ответ, это на самом деле технически возможно, но на практике это не так хорошо. Номера версий 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 // <=== here!!
0 Win32 version
...
Что нового в .NET 4.5, так это то, что компиляторы изменят версию подсистемы на 6.00. Изменения, которые были чрезмерны, в основном потому, что Windows обращает внимание на это число, за исключением проверки, достаточно ли он достаточно. Он также включает функции appcompat, поскольку он предполагает, что программа была написана для работы в старых версиях Windows. Эти функции вызывают проблемы, особенно то, как Windows лежит вокруг размера окна в Aero. Он перестает лежать вокруг жирных границ окна Aero, когда он видит, что программа была разработана для запуска в версии Windows с Aero.
Вы можете изменить этот номер версии и установить ее обратно на 4.00, запустив Editbin.exe на своих сборках с опцией/подсистемой. Этот ответ показывает пример postbuild.
Что касается того, где заканчиваются хорошие новости, значительная проблема заключается в том, что .NET 4.5 не очень совместим с .NET 4.0. Безусловно, самое большое зависание состоит в том, что классы перемещались из одной сборки в другую. В частности, это произошло для атрибута [Extension]. Ранее в System.Core.dll он был перенесен в Mscorlib.dll в .NET 4.5. Это kaboom на XP, если вы объявляете свои собственные методы расширения, ваша программа говорит, чтобы посмотреть в Mscorlib для атрибута, активированного атрибутом [TypeForwardedTo] в версии .NET 4.5 эталонной сборки System.Core. Но его нет, когда вы запускаете свою программу на .NET 4.0
И, конечно же, нет ничего, что помогло бы прекратить использование классов и методов, доступных только на .NET 4.5. Когда вы это сделаете, ваша программа завершится с ошибкой TypeLoadException или MissingMethodException при запуске 4.0
Просто установите цель 4.0, и все эти проблемы исчезнут. Или сломайте эту ловушку и прекратите поддерживать XP, бизнес-решение, которое программисты не могут делать часто, но, безусловно, могут поощрять, указывая на судороги, которые он вызывает. Разумеется, нет ненужной стоимости для поддержки старых операционных систем, просто усилия по тестированию существенны. Стоимость, которая нередко распознается руководством, совместимость Windows является легендарной, если только она не указана на них. Вперед, что стоит клиенту, и они склонны принимать правильное решение намного быстрее:) Но мы не можем вам помочь.