Mientras que Hans Passant tiene razón en todo lo que dice, echa de menos un punto clave que es el papel del encabezado PE en esta debacle.
Dado que Dotnet 4.5 es una instalación in situ sobre la parte superior de Dotnet 4.0, y porque no actualiza el número de versión Dotnet, el resultado es que los binarios construidos con Dotnet 4.5 tienen el antiguo número de versión Dotnet 4.0 en su encabezado PE del binario (4.0.30319).
Porque CLR usa este valor en el encabezado PE para determinar qué versión de Dotnet Framework cargar y porque este valor no cambia para los ensamblados construidos contra Dotnet 4.5, entonces, en ausencia de información adicional, el CLR no tiene forma de saber si un ensamblado con 4.0.30319 en el encabezado PE requiere un enlace a Dotnet 4.0 o 4.5.
Es la presencia del elemento supportedRuntime en app.config que proporciona esta información adicional al CLR. Por lo tanto, si inicia una aplicación Dotnet 4.5 con la entrada supportedRuntime presente en un sistema que solo tiene Dotnet 4.0 instalado, entonces el CLR mostrará un mensaje útil que le informará que no tiene instalada la versión requerida de Dotnet. Mientras que si inicia la misma aplicación Dotnet 4.5 sin la entrada supportedRuntime en un sistema que solo tiene Dotnet 4.0 instalado, entonces la aplicación puede comenzar a ejecutarse, pero luego se bloquea cuando más tarde trata de usar una función Dotnet 4.5.
Si bien los proyectos creados con VS2012 RC y la orientación a Dotnet 4.5 pueden haber perdido la entrada supportedRuntime, los proyectos creados con VS2012 RTM tienen la entrada.
así que cuando el usuario tiene .NET 4.0 mostrará un error diciendo que se requiere .NET 4.5 con esa configuración. ¿Qué tal si esa configuración no está allí?¿No será eso también un error de todos modos desde que me he centrado en .NET 4.5? – friend
Sí, pero uno que es mucho más difícil de interpretar. Al igual que MissingMethodException o FileNotFoundException, no es un mensaje amistoso como "No tiene .NET 4.5, ¿quiere que lo instale?" Ver http://stackoverflow.com/a/10033128/17034 –
@nobugz, siempre he estado un poco confundido acerca de qué versión de .NET necesitaba poner a disposición junto con mi aplicación. En función de su comentario anterior, ¿debo entender que las aplicaciones que tienen como objetivo .NET 4.5 ** solo ** tienen que hacer que .NET 4.5 esté disponible? En otras palabras, no me tengo que preocupar si .NET 3.5, 3.0, etc. están en el sistema? –