¿Es posible ejecutar una aplicación .NET 4.5 en XP?

86

Primero, he leído lo siguiente:

Entonces, desde la última viñeta, realmente creo que no hay forma de evitar esto, pero tenía que ver si podía obtener una respuesta definitiva ya que a mi equipo le gustaría actualizar de .NET 4.0 a .NET 4.5. Sin embargo, tenemos que admitir XP.

¿No hay posibilidad de pasar a .NET 4.5 si queremos admitir XP?

Lo único que se me ocurre es crear dos soluciones separadas, pero luego las bases de código tendrían que divergir si usáramos las características de .NET 4.5.

Por lo tanto, estoy buscando una solución alternativa increíble que no pude encontrar y que otros tal vez ya sepan.

Justin Pihony
fuente
9
No, no puedes. Apégate a 4.0 hasta que XP muera definitivamente.
Federico Berasategui

Respuestas:

188

Dudo en publicar esta respuesta, en realidad es técnicamente posible pero no funciona tan bien en la práctica. Los números de versión de CLR y los ensamblados del marco principal no se cambiaron en 4.5. Aún tiene como destino v4.0.30319 de CLR y los números de versión del ensamblado del marco siguen siendo 4.0.0.0. Lo único que distingue al manifiesto de ensamblado cuando lo mira con un desensamblador como ildasm.exe es la presencia de un atributo [TargetFramework] que dice que se necesita 4.5, que tendría que modificarse. En realidad, no es tan fácil, lo emite el compilador.

La mayor diferencia no es tan visible, Microsoft hizo un cambio muy esperado en el encabezado ejecutable de los ensamblados. Que especifica con qué versión de Windows es compatible el ejecutable. XP pertenece a una generación anterior de Windows, que comenzó con Windows 2000. Su número de versión principal es 5. Vista fue el comienzo de la generación actual, la versión principal número 6.

Los compiladores de .NET siempre han especificado que el número de versión mínimo sea 4.00, la versión de Windows NT y Windows 9x. Puede ver esto ejecutando dumpbin.exe / headers en el ensamblado. La salida de muestra se ve así:

OPTIONAL HEADER VALUES
             10B magic # (PE32)
            ...
            4.00 operating system version
            0.00 image version
            4.00 subsystem version              // <=== here!!
               0 Win32 version
            ...

Lo nuevo en .NET 4.5 es que los compiladores cambian esa versión del subsistema a 6.00. Un cambio que se retrasó en gran parte porque Windows presta atención a ese número, más allá de solo verificar si es lo suficientemente pequeño. También activa las funciones de appcompat, ya que asume que el programa fue escrito para funcionar en versiones antiguas de Windows. Estas características causan problemas, particularmente la forma en que Windows miente sobre el tamaño de una ventana en Aero es problemático. Deja de mentir sobre los bordes gruesos de una ventana de Aero cuando puede ver que el programa fue diseñado para ejecutarse en una versión de Windows que tiene Aero.

Puede modificar ese número de versión y volver a establecerlo en 4.00 ejecutando Editbin.exe en sus ensamblados con la opción / subsystem. Esta respuesta muestra un evento posterior a la compilación de muestra.

Sin embargo, ahí es donde terminan las buenas noticias, un problema importante es que .NET 4.5 no es muy compatible con .NET 4.0. Con mucho, el mayor problema es que las clases se trasladaron de una asamblea a otra. En particular, eso sucedió con el atributo [Extensión]. Anteriormente en System.Core.dll, se movió a Mscorlib.dll en .NET 4.5. Eso es un kaboom en XP si declara sus propios métodos de extensión, su programa dice que busque en Mscorlib el atributo, habilitado por un atributo [TypeForderedTo] en la versión .NET 4.5 del ensamblado de referencia System.Core. Pero no está ahí cuando ejecuta su programa en .NET 4.0

Y, por supuesto, no hay nada que le ayude a dejar de usar clases y métodos que solo están disponibles en .NET 4.5. Cuando lo haga, su programa fallará con una TypeLoadException o MissingMethodException cuando se ejecute en 4.0

Solo apunte a 4.0 y todos estos problemas desaparecerán. O rompa ese atasco y deje de admitir XP, una decisión comercial que los programadores no pueden tomar con frecuencia, pero que ciertamente pueden alentar al señalar los problemas que está causando. Por supuesto, el tener que soportar sistemas operativos antiguos tiene un costo distinto de cero, solo que el esfuerzo de prueba es sustancial. Un costo que a menudo no es reconocido por la administración, la compatibilidad con Windows es legendaria, a menos que se les indique. Transmita ese costo al cliente y ellos tienden a tomar la decisión correcta mucho más rápido :) Pero no podemos ayudarlo con eso.

Hans Passant
fuente
2
Gracias Hans, pensé que había algunos cambios importantes. También aprecio la solución. No podemos aceptarlo por las razones que especificó, pero es bueno saberlo. Quizás XP desaparezca definitivamente algún día ...
Justin Pihony
3
just the testing effort is substantial- Eso es lo que hizo que nuestra administración "permitiera eliminar el soporte de XP".
Christoph Fink
Sé que esta es una publicación antigua, pero @JustinPihony: ¿Su empresa alguna vez pensó en instalar un sistema operativo posterior y luego instalar VMWare o Virtual Box? Es un poco tarde para Windows 7, pero Microsoft regaló una instalación virtual de Windows XP que le permitió alternar entre 7 y XP. Solo un pensamiento. :-)
Mark Manning
@MarkManning no estaba bajo nuestro control. Se estaba utilizando en otro lugar.
Justin Pihony
1
@JustinPihony: Ah. Hmmmmm ... Mi única otra sugerencia es un kluge. Capture la versión del sistema operativo y luego configure todas las funciones en sus clases para colocarlas en matrices (o una matriz). Haga que una matriz (o parte de una matriz) sea para XP y la otra para sistemas operativos más nuevos. Entonces, todo lo que necesita es algún tipo de variable global que se use para indicar qué conjunto usar. Las llamadas pueden ser todas iguales (o tener el mismo aspecto) pero un conjunto usa NET40_ <FUNCTION> y los otros pueden usar NET45_ <FUNCTION>. Esta sería una llamada indirecta a la función en sí. ¿Tiene sentido?
Mark Manning
21

Lamentablemente, no, no puede ejecutar programas 4.5 en XP.

Y la publicación relevante de esa página de Connect:

Publicado por Microsoft el 23/03/2012 a las 10:39
Gracias por el informe. Este comportamiento es por diseño en .NET Framework 4.5 Beta. Los sistemas operativos mínimos admitidos son Windows 7, Windows Server 2008 SP2 y Windows Server 2008 R2 SP1. Windows XP no es un sistema operativo compatible con la versión Beta.

Oztaco - Reincorporar a Monica C.
fuente
8

El proyecto Mono eliminó el soporte de Windows XP y "olvidó" mencionarlo. Aunque todavía afirman que Windows XP SP2 es la versión mínima compatible, en realidad es Windows Vista.

La última versión de Mono compatible con Windows XP fue 3.2.3.

invitado
fuente
7

Prueba mono:

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

Esta descarga funciona en todas las versiones de Windows XP, 2003, Vista y Windows 7.

luiseduardohd
fuente
2
Mono es más lento que .NET, y aunque tiene la mayoría de las características de .NET 4.5, carece de ciertos componentes importantes como WPF ( mono-project.com/Compatibility ). Por lo tanto, puede usar el soporte de Mono para XP si proporciona todo lo que necesita y está de acuerdo con las implicaciones de rendimiento. En el lado positivo, no debería haber necesidad de crear una "compilación Mono" especial, la compilación normal de .NET 4.5 normalmente funciona en Mono, pero debe probar con Mono específicamente para asegurarse de que sea compatible.
Qwertie
2
Probé mono-3.12.1-gtksharp-2.12.26-win32-0.msi en Windows XP SP3 y fallé con "mono.exe no es una aplicación Win32 válida" . También probé mono-3.0.10-gtksharp-2.12.11-win32-0.exe que falló con "mono.exe - Punto de entrada no encontrado. El punto de entrada del procedimiento InterlockedCompareExchange64 no se pudo ubicar en la biblioteca de vínculos dinámicos KERNEL32 .dll " .
Cristian Ciupitu