Esito a pubblicare questa risposta, in realtà è tecnicamente possibile ma non funziona così bene nella pratica. I numeri di versione di CLR e gli assembly del framework principale non sono stati modificati nella 4.5. Hai ancora come destinazione v4.0.30319 del CLR e i numeri di versione dell'assembly del framework sono ancora 4.0.0.0. L'unica cosa distintiva del manifesto dell'assembly quando lo guardi con un disassembler come ildasm.exe è la presenza di un attributo [TargetFramework] che dice che è necessario 4.5, che dovrebbe essere modificato. In realtà non è così facile, viene emesso dal compilatore.
La differenza più grande non è così visibile, Microsoft ha apportato una modifica attesa da tempo nell'intestazione eseguibile degli assembly. Che specifica con quale versione di Windows è compatibile l'eseguibile. XP appartiene a una precedente generazione di Windows, iniziata con Windows 2000. Il numero di versione principale è 5. Vista è stato l'inizio della generazione attuale, la versione principale numero 6.
I compilatori .NET hanno sempre specificato che il numero di versione minimo è 4.00, la versione di Windows NT e Windows 9x. Puoi vederlo eseguendo dumpbin.exe / headers sull'assembly. L'output di esempio è simile a questo:
OPTIONAL HEADER VALUES
10B magic # (PE32)
...
4.00 operating system version
0.00 image version
4.00 subsystem version
0 Win32 version
...
La novità di .NET 4.5 è che i compilatori cambiano la versione del sottosistema in 6.00. Un cambiamento che era scaduto in gran parte perché Windows presta attenzione a quel numero, oltre a controllare se è abbastanza piccolo. Attiva anche le funzionalità di compatibilità delle app poiché presuppone che il programma sia stato scritto per funzionare su vecchie versioni di Windows. Queste funzionalità causano problemi, in particolare il modo in cui Windows si trova sulle dimensioni di una finestra in Aero è problematico. Smette di mentire sui bordi grossi di una finestra Aero quando può vedere che il programma è stato progettato per funzionare su una versione di Windows che ha Aero.
È possibile modificare il numero di versione e reimpostarlo su 4.00 eseguendo Editbin.exe sugli assembly con l'opzione / subsystem. Questa risposta mostra un esempio di evento postbuild.
Tuttavia, è qui che finiscono le buone notizie, un problema significativo è che .NET 4.5 non è molto compatibile con .NET 4.0. Il problema di gran lunga maggiore è che le classi sono state spostate da un assembly a un altro. In particolare, ciò è accaduto per l'attributo [Extension]. In precedenza in System.Core.dll, veniva spostato in Mscorlib.dll in .NET 4.5. Questo è un kaboom su XP se si dichiarano i propri metodi di estensione, il programma dice di cercare in Mscorlib l'attributo, abilitato da un attributo [TypeForwardedTo] nella versione .NET 4.5 dell'assembly di riferimento System.Core. Ma non è presente quando esegui il tuo programma su .NET 4.0
E ovviamente non c'è nulla che ti aiuti a smettere di usare classi e metodi che sono disponibili solo su .NET 4.5. Quando lo fai, il tuo programma fallirà con un'eccezione TypeLoadException o MissingMethodException se eseguito su 4.0
Scegli come target 4.0 e tutti questi problemi scompaiono. Oppure rompi quel blocco e smetti di supportare XP, una decisione aziendale che i programmatori spesso non possono prendere ma possono certamente incoraggiare sottolineando i problemi che sta causando. Ovviamente c'è un costo diverso da zero per dover supportare vecchi sistemi operativi, solo lo sforzo di test è sostanziale. Un costo che spesso non viene riconosciuto dal management, la compatibilità con Windows è leggendaria, a meno che non venga loro segnalato. Inoltra il costo al cliente e tendono a prendere la decisione giusta molto più rapidamente :) Ma non possiamo aiutarti in questo.