Я вагаюся розмістити цю відповідь, це насправді технічно можливо, але на практиці це не так добре працює. Номери версій 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 / заголовки на збірці. Зразок виводу виглядає так:
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. Це kaboom для XP, якщо ви заявите про власні методи розширення, ваша програма каже шукати в Mscorlib атрибут, увімкнений атрибутом [TypeForwardedTo] у версії .NET 4.5 довідкової збірки System.Core. Але його немає, коли ви запускаєте програму на .NET 4.0
І звичайно, нічого не допоможе вам припинити використання класів та методів, доступних лише у .NET 4.5. Коли ви це зробите, ваша програма не вдасться виконати TypeLoadException або MissingMethodException під час запуску 4.0
Просто встановіть ціль 4.0 і всі ці проблеми зникнуть. Або зламати цю помилку і припинити підтримку XP - ділового рішення, яке програмісти не можуть часто прийняти, але, звичайно, можуть заохотити, вказавши на клопоти, які це спричиняє. Звичайно, необхідність підтримувати стародавні операційні системи не є нульовою вартістю, лише зусилля з тестування є значними. Сума сумісності Windows, яка часто не визнається керівництвом, є легендарною, якщо на це не вказано. Переадресуйте цю вартість клієнту, і вони, як правило, приймають правильне рішення набагато швидше :) Але ми не можемо вам у цьому допомогти.