È possibile eseguire un'app .NET 4.5 su XP?


86

Innanzitutto, ho letto quanto segue:

Quindi, dall'ultimo punto, penso davvero che non ci sia modo di aggirare questo, ma ho dovuto vedere se potevo ottenere una risposta definitiva poiché il mio team vorrebbe aggiornare da .NET 4.0 a .NET 4.5. Tuttavia, dobbiamo supportare XP.

Non è possibile passare a .NET 4.5 se si desidera supportare XP?

L'unica cosa a cui potrei pensare è creare due soluzioni separate, ma poi le basi di codice dovrebbero divergere se usassimo le funzionalità .NET 4.5.

Quindi, sto cercando una soluzione straordinaria che non sono riuscito a trovare e che altri forse già conoscono.


9
No, non puoi. Attenersi a 4.0 finché XP non muore definitivamente.
Federico Berasategui

Risposte:


188

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              // <=== here!!
               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.


2
Grazie Hans, ho pensato che ci fossero dei cambiamenti decisivi. Apprezzo anche la soluzione alternativa. Non possiamo accettarlo per i motivi che hai specificato, ma è bene sapere. Forse un giorno XP andrà via per sempre ...
Justin Pihony

3
just the testing effort is substantial- questo è ciò che ha consentito alla nostra gestione di "consentire di abbandonare il supporto per XP".
Christoph Fink

So che questo è un vecchio messaggio - ma - @JustinPihony: la tua azienda ha mai pensato di installare un sistema operativo successivo e quindi installare VMWare o Virtual Box? È un po 'tardi per Windows 7, ma Microsoft ha dato via un'installazione virtuale di Windows XP che ti ha permesso di passare da 7 a XP. Solo un pensiero. :-)
Mark Manning

@MarkManning non era sotto il nostro controllo. Veniva usato altrove.
Justin Pihony

1
@JustinPihony: Ah. Hmmmmm ...... Il mio unico altro suggerimento è un kluge. Cattura la versione del sistema operativo e quindi imposta tutte le funzioni nelle tue classi da inserire negli array (o in un array). Avere un array (o parte di un array) per XP e l'altro per i sistemi operativi più recenti. Quindi tutto ciò di cui hai bisogno è un qualche tipo di variabile globale che viene utilizzata per denotare quale set utilizzare. Le chiamate potrebbero essere tutte uguali (o avere lo stesso aspetto) ma un set utilizza NET40_ <FUNCTION> e gli altri potrebbero utilizzare NET45_ <FUNCTION>. Questa sarebbe una chiamata indiretta alla funzione stessa. Ha senso?
Mark Manning

21

Purtroppo no, non puoi eseguire programmi 4.5 su XP.

E il post pertinente da quella pagina Connect:

Postato da Microsoft il 23/03/2012 alle 10:39
Grazie per il report. Questo comportamento è di progettazione in .NET Framework 4.5 Beta. I sistemi operativi minimi supportati sono Windows 7, Windows Server 2008 SP2 e Windows Server 2008 R2 SP1. Windows XP non è un sistema operativo supportato per la versione Beta.


8

Il progetto Mono ha abbandonato il supporto di Windows XP e "si è dimenticato" di menzionarlo. Sebbene affermino ancora che Windows XP SP2 è la versione minima supportata, in realtà è Windows Vista.

L'ultima versione di Mono a supportare Windows XP era la 3.2.3.


7

Prova mono:

http://www.go-mono.com/mono-downloads/download.html

Questo download funziona su tutte le versioni di Windows XP, 2003, Vista e Windows 7.


2
Mono è più lento di .NET e, sebbene abbia la maggior parte delle funzionalità di .NET 4.5, manca di alcuni componenti principali come WPF ( mono-project.com/Compatibility ). Quindi puoi usare Mono per il supporto di XP se fornisce tutto ciò di cui hai bisogno e sei d'accordo con le implicazioni sulle prestazioni. Tra i lati positivi, non dovrebbe essere necessario creare una speciale "build Mono", la normale build .NET 4.5 funziona in genere con Mono, ma è necessario eseguire test su Mono in modo specifico per assicurarsi di essere compatibili.
Qwertie

2
Ho provato mono-3.12.1-gtksharp-2.12.26-win32-0.msi in Windows XP SP3 e non è riuscito con "mono.exe non è un'applicazione Win32 valida" . Ho anche provato mono-3.0.10-gtksharp-2.12.11-win32-0.exe che ha fallito con "mono.exe - Punto di ingresso non trovato. Impossibile trovare il punto di ingresso della procedura InterlockedCompareExchange64 nella libreria di collegamento dinamico KERNEL32 .dll " .
Cristian Ciupitu

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.