¿Qué significa realmente apuntar a un framework y cómo maximizo la compatibilidad?


Saludos a todos,

Esto me ha confundido desde que empecé a codificar en C#. Mi objetivo es crear un ensamblado que se ejecute en el. NET framework más reciente que tenga el usuario, cualquiera que sea. No quiero requieren .NET 4 para ser instalado, pero quiero utilizar si el usuario lo tiene, y lo que es más importante, quiero que todavía funciona si el usuario tiene sólo .NET 4 y nada debajo. Empiezo a sospechar que esto ni siquiera es posible.

Realmente no entiendo lo que estoy seleccionando cuando cambio el "Marco de destino" en Visual Studio. ¿Eso significa que "será compatible con esta versión y arriba"? O "será compatible solo con esta versión"? Parece que es lo último hasta ahora; mis pruebas en máquinas virtuales muestran ensamblados dirigidos. NET 4 fallando sin. NET 4, y ensamblados dirigidos. NET 3.5 fallando sin. NET 3.5. ¿No hay forma de establecer esto para que pueda lograr la máxima compatibilidad?

ACTUALIZACIÓN: Para aclarar, tengo un programa que se dirige . NET 2. Los carteles aquí parecen indicar que debería cargarse con. NET 4. Pero en un entorno con solo. NET 4 y nada antes, no se carga.

UPDATE2: Está bien, lo descubrí, pero es mucho más complejo de lo que los carteles aquí parecen pensar. Estoy abriendo una pregunta diferente para discutir las complejidades, pero la versión corta es, necesitas una aplicación.config con <supportedRuntime version="v4.0" /> si desea ejecutar non-.NET 4 montajes en. NET 4. No cargarán sin él.

Author: Paul Accisano, 2010-12-06

4 answers

Los frameworks están diseñados para ser compatibles con versiones anteriores; si tiene un programa escrito en.NET 2.0, puede ejecutarlo en tiempo de ejecución 4.0, porque ninguno de los frameworks elimina la funcionalidad que tenía una versión anterior (por lo que todavía tenemos las colecciones no genéricas como ArrayList, a pesar de que están obsoletas a favor de las colecciones genéricas). Sin embargo, lo contrario no es necesariamente cierto; una aplicación 4.0 no está garantizada para ejecutarse en 2.0, porque PUEDE aprovechar las nuevas características de el nuevo tiempo de ejecución que no está disponible en versiones anteriores. En cualquier caso, si desea que su aplicación intente ejecutarse en versiones de tiempo de ejecución a las que no está dirigida específicamente, debe especificarlo en la aplicación.config usando elementos SupportedRuntime.

Para responder a su pregunta específica, puede hacer lo que quiera con el siguiente procedimiento básico:

  • Desarrolle su aplicación para dirigirse a la PRIMERA versión de framework que desee admitir. Esto deshabilitará el acceso a las nuevas características de los tiempos de ejecución más nuevos (como Linq en 3.5 y dynamic typing en 4.0) garantizan que su aplicación no requerirá ninguna función que no pueda ser proporcionada por ninguno de los tiempos de ejecución compatibles.

  • Especifique los marcos que son aceptables para su aplicación mediante el elemento SupportedRuntime en su aplicación.archivo de configuración. Esto le dirá al código nativo que inicializa el tiempo de ejecución en el que se ejecutará tu aplicación que si no puede encontrar la versión objetivo, cualquiera de las otras es aceptable. Creo que el el comportamiento es buscar primero el framework de destino y, si no está disponible, debe usar el tiempo de ejecución más reciente compatible.

 22
Author: KeithS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-06 20:21:00

. NET es compatible con versiones anteriores, esto significa que si selecciona. NET Framework 2.0 como marco de destino, se ejecutará en las versiones instaladas 2.0, 3.0, 3.5 y 4.0. Pero si selecciona, por ejemplo, la versión 4.0 como marco de destino, solo se ejecutará si tiene instalada la versión 4.0.

 2
Author: Flagbug,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-06 19:56:43

Yo creo que esto se supone que es cualquier versión que seleccione y hacia arriba. Por lo tanto, si se dirige al marco 2.0, debería funcionar si el cliente tiene marcos 2.0, 3.0, 3.5 o 4.0 instalados.

También está seleccionando características de idioma cuando elige esto, por lo que no sé de ninguna manera que pueda usar características del marco 4.0 utilizando una aplicación orientada al marco 2.0. Incluso la carga dinámica de ensamblados no funciona, intente cargar un dll compilado a 4.0 desde una aplicación 2.0, no te dejará.

 0
Author: BlackICE,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-06 19:56:18

Así es como funciona la segmentación: Si se dirige a.NET 3.5, no se ejecutará si el usuario no tiene. NET 3.5. Se ejecutará si el usuario tiene alguna versión superior.

Para obtener la máxima compatibilidad, elija. NET 2.0, se ejecutará incluso en. NET 3.5, 4.0, etc.

Sin embargo, es posible que pierda nuevas características de.NET como LINQ, etc.

Http://msdn.microsoft.com/en-us/library/bb398197 (VS.100).aspx

¿Puedo seguir apuntando a. NET Framework 2.0 en VisualStudio 2010?

 0
Author: Madhur Ahuja,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:17:30