Problemas de migración de .NET Framework 4

En este artículo se describen los problemas de migración entre .NET Framework versión 3.5 Service Pack 1 y .NET Framework versión 4, incluidas las correcciones, los cambios para el cumplimiento de estándares y la seguridad, y los cambios basados en los comentarios de los clientes. La mayoría de estos cambios no exigen que realice ningún tipo de modificación de programación en sus aplicaciones. Para obtener los que podrían implicar modificaciones, vea la columna Cambios recomendados de la tabla. Los cambios importantes se desglosan por área, por ejemplo, ASP.NET y Windows Presentation Foundation (WPF).

Para obtener información más general sobre las incidencias de este artículo, vea Guía de migración para .NET Framework 4.

Para obtener información sobre las características nuevas, vea Novedades de .NET Framework 4.

ASP.NET y web

Espacios de nombres: System.Web, System.Web.Mobile, System.Web.Security, System.Web.UI.WebControls

Ensamblado: System.Web (en System.Web.dll)

Característica Diferencias respecto a 3.5 SP1 Cambios recomendados
Archivos de definición de explorador Los archivos de definición de explorador se han actualizado para que incluyan información sobre exploradores y dispositivos nuevos y actualizados. Se han quitado exploradores y dispositivos anteriores, como Netscape Navigator, y se han agregado exploradores y dispositivos más recientes, como Google Chrome y Apple iPhone.

Si la aplicación contiene definiciones de explorador personalizadas que heredan de una de las definiciones de explorador que se han quitado, aparecerá un error.

El objeto HttpBrowserCapabilities (que se expone mediante la propiedad Request.Browse de la página) está controlado por los archivos de definición del explorador. Por lo tanto, la información que se devuelve mediante el acceso a una propiedad de este objeto en ASP.NET 4 podría ser diferente de la información devuelta en una versión anterior de ASP.NET.
Si la aplicación se basa en los archivos de definición del explorador antiguo, puede copiarlos de la siguiente carpeta:

Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\Browsers

Copie los archivos en la carpeta \CONFIG\Browsers correspondiente de ASP.NET 4. Después de copiar los archivos, ejecute la herramienta de línea de comandos Aspnet_regbrowsers.exe. Para obtener más información, vea el sitio web https://www.asp.net/mobile.
Aplicaciones secundarias que se ejecutan en versiones mixtas de ASP.NET Las aplicaciones de ASP.NET 4 configuradas como elementos secundarios de aplicaciones que ejecutan versiones anteriores de ASP.NET podrían no iniciarse debido a errores de configuración o de compilación. El error que aparezca dependerá de si la aplicación se ejecuta en IIS 6.0, en IIS 7 o en IIS 7.5. Puede realizar cambios en los archivos de configuración de las aplicaciones afectadas para que el sistema de configuración reconozca correctamente la aplicación de ASP.NET 4. Para obtener información sobre los cambios que debe realizar, vea la sección "ASP.NET 4 Child Applications Fail to Start When Under ASP.NET 2.0 or ASP.NET 3.5 Applications" (Las aplicaciones secundarias de ASP.NET 4 no se inician cuando se ejecutan en aplicaciones de ASP.NET 2.0 o ASP.NET 3.5) en el documento ASP.NET 4 Breaking Changes (Cambios importantes de ASP.NET 4) en el sitio web de ASP.NET.
Cambios de ClientID La nueva opción clientIDMode de ASP.NET 4 permite especificar cómo genera ASP.NET el atributo id para los elementos HTML. En versiones anteriores de ASP.NET, el comportamiento predeterminado era equivalente al valor AutoID de clientIDMode. Ahora, el valor predeterminado es Predictable. Para obtener más información, vea Identificación de controles de formularios Web Forms. Si usa Visual Studio para actualizar la aplicación desde ASP.NET 2.0 o ASP.NET 3.5, la herramienta agrega automáticamente una configuración en el archivo Web.config que conserva el comportamiento de versiones anteriores de .NET Framework. Pero si actualiza una aplicación y cambia el grupo de aplicaciones en IIS para elegir como destino .NET Framework 4, ASP.NET usa el nuevo modo de forma predeterminada. Para deshabilitar el nuevo modo de identificador de cliente, agregue el valor siguiente al archivo Web.config:

<pages clientIDMode="AutoID" />
Seguridad de acceso del código (CAS) Las características de .NET de ASP.NET 2.0 que se han agregado a ASP.NET 3.5 usan el modelo de seguridad de acceso del código (CAS) de .NET Framework 1.1 y .NET Framework 2.0. Aun así, la implementación de CAS en ASP.NET 4 se ha mejorado considerablemente. Como resultado, podría producirse un error con varias excepciones de seguridad en las aplicaciones de ASP.NET de confianza parcial que se basan en código de confianza que se ejecuta en la caché global de ensamblados. También se podrían producir errores y excepciones de seguridad en las aplicaciones de confianza parcial que se basan en modificaciones extensas de la directiva de CAS del equipo. Puede revertir las aplicaciones de ASP.NET 4 de confianza parcial al comportamiento de ASP.NET 1.1 y 2.0 mediante el uso del nuevo atributo legacyCasModel en el elemento de configuración trust, como se muestra en el ejemplo siguiente:

<trust level= "Medium" legacyCasModel="true" />

Importante: El hecho de revertir al modelo anterior de CAS podría reducir la seguridad.

Para obtener más información sobre el nuevo modelo de seguridad de acceso del código de ASP.NET 4, vea Seguridad de acceso del código para aplicaciones ASP.NET 4.
Archivos de configuración Los archivos de configuración raíz (machine.config y el archivo raíz Web.config) para .NET Framework y ASP.NET 4 se han actualizado para incluir la mayor parte de la información de configuración reutilizable que se encontraba en los archivos de aplicación Web.config de ASP.NET 3.5. Dada la complejidad de los sistemas de configuración administrados de IIS 7 e IIS 7.5, la ejecución de aplicaciones de ASP.NET 3.5 en ASP.NET 4 y en IIS 7 e IIS 7.5 puede producir errores de ASP.NET o de IIS. Actualice las aplicaciones de ASP.NET 3.5 a ASP.NET 4 mediante las herramientas de actualización de proyectos de Visual Studio. Visual Studio 2010 modifica automáticamente el archivo Web.config de la aplicación de ASP.NET 3.5 para que contenga la configuración adecuada para ASP.NET 4.

Pero puede ejecutar aplicaciones ASP.NET 3.5 con .NET Framework 4 sin necesidad de volver a compilar. En ese caso, es posible que tenga que modificar manualmente el archivo Web.config de la aplicación antes de ejecutarla en .NET Framework 4 y en IIS 7 o IIS 7.5. El cambio específico que debe realizar depende de la combinación de software con la que trabaje, incluidas las versiones de Service Pack (SP). Para obtener información sobre las combinaciones de software que se pueden ver afectadas por este cambio y saber cómo resolver los problemas de combinaciones específicas, vea la sección "Configuration Errors Related to New ASP.NET 4 Root Configuration" (Errores de configuración relacionados con la nueva configuración raíz de ASP.NET 4) en el documento ASP.NET 4 Breaking Changes (Cambios importantes de ASP.NET 4) en el sitio web de ASP.NET.
Representación de controles En versiones anteriores de ASP.NET, algunos controles emitían un marcado que no se podía deshabilitar. De forma predeterminada, este tipo de marcado ya no se genera en ASP.NET 4. Los cambios de representación afectan a los siguientes controles:

* Los controles Image y ImageButton ya no representan un atributo border="0".
* La clase BaseValidator y los controles de validación que derivan de ella ya no representan texto rojo de forma predeterminada.
* El control HtmlForm no representa un atributo name.
* El control Table ya no representa un atributo border="0".

Los controles que no están diseñados para la entrada del usuario (por ejemplo, el control Label) ya no representan el atributo disabled="disabled" si su propiedad Enabled está establecida en false (o si heredan esta configuración de un control contenedor).
Si usa Visual Studio para actualizar la aplicación desde ASP.NET 2.0 o ASP.NET 3.5, la herramienta agrega automáticamente una configuración en el archivo Web.config que conserva la representación heredada. Pero si actualiza una aplicación y cambia el grupo de aplicaciones en IIS para elegir como destino .NET Framework 4, ASP.NET usa de forma predeterminada el nuevo modo de representación. Para deshabilitar el nuevo modo de representación, agregue el valor siguiente al archivo Web.config:

<pages controlRenderingCompatibilityVersion="3.5" />
Controladores de eventos en documentos predeterminados ASP.NET 4 representa el valor de atributo action del elemento HTML form como una cadena vacía cuando se realiza una solicitud a una dirección URL sin extensión que tiene asignado un documento predeterminado. En versiones anteriores de ASP.NET, una solicitud a http://contoso.com daría como resultado una solicitud a Default.aspx. En ese documento, la etiqueta form de apertura se representaría como en el ejemplo siguiente:

<form action="Default.aspx" />

En ASP.NET 4, una solicitud a http://contoso.com también daría como resultado una solicitud a Default.aspx, pero ASP.NET ahora representa la etiqueta de apertura HTML form como en el ejemplo siguiente:

<form action="" />

Cuando el atributo action es una cadena vacía, el objeto DefaultDocumentModule de IIS crea una solicitud secundaria a Default.aspx. En la mayoría de las condiciones, esta solicitud secundaria es transparente para el código de la aplicación y la página Default.aspx se ejecuta con normalidad. A pesar de ello, una interacción potencial entre el código administrado y el modo integrado de IIS 7 o IIS 7.5 puede hacer que las páginas .aspx administradas dejen de funcionar correctamente durante la solicitud secundaria. Si se producen las condiciones siguientes, la solicitud secundaria a un documento .aspx predeterminado producirá un error o un comportamiento inesperado:

* Una página .aspx se envía al explorador con el atributo action del elemento form establecido en "".
* El formulario se envía de vuelta a ASP.NET.
* Un módulo HTTP administrado lee una parte del cuerpo de la entidad, como Request.Form o Request.Params. Esto hace que el cuerpo de la entidad de la solicitud POST se lea en la memoria administrada. Como resultado, el cuerpo de la entidad ya no está disponible para los módulos de código nativo que se ejecutan en el modo integrado de IIS 7 o IIS 7.5.
* El objeto DefaultDocumentModule de IIS finalmente se ejecuta y crea una solicitud secundaria al documento Default.aspx. Sin embargo, dado que un fragmento del código administrado ya ha leído el cuerpo de la entidad, no hay ningún cuerpo de entidad disponible para enviarlo a la solicitud secundaria.
* Cuando se ejecuta la canalización HTTP para la solicitud secundaria, el controlador de archivos .aspx se ejecuta durante la fase de ejecución de controlador.

Dado que no hay ningún cuerpo de entidad, no hay variables de formulario ni estado de vista. Por lo tanto, no hay información disponible para que el controlador de páginas .aspx determine qué evento se debe generar (en caso de que sea necesario). Como resultado, no se ejecuta ninguno de los controladores de eventos postback para la página .aspx afectada.
Para obtener información sobre las formas de solucionar los problemas que pueden surgir como resultado de este cambio, vea "Event Handlers Might Not Be Not Raised in a Default Document in IIS 7 or IIS 7.5 Integrated Mode" (Podrían no producirse eventos de controladores en un documento predeterminado en el modo integrado de IIS 7 o IIS 7.5) en el documento ASP.NET 4 Breaking Changes (Cambios importantes de ASP.NET 4) en el sitio web de ASP.NET.
Algoritmo hash ASP.NET usa cifrado y algoritmos hash para ayudar a proteger los datos, como las cookies de autenticación de formularios y el estado de vista. De forma predeterminada, ASP.NET 4 usa el algoritmo HMACSHA256 para las operaciones de hash en las cookies y el estado de vista. Las versiones anteriores de ASP.NET usaban el algoritmo HMACSHA1, más antiguo. Si ejecuta aplicaciones que combinan ASP.NET 2.0 y ASP.NET 4, en las que los datos como las cookies de autenticación de formularios deben funcionar en diferentes versiones de .NET Framework, configure una aplicación web de ASP.NET 4 de modo que use el algoritmo HMACSHA1 antiguo. Para ello, agregue el valor de configuración siguiente en el archivo Web.config:

<machineKey validation="SHA1" />
Hospedar controles en Internet Explorer Ya no se pueden hospedar controles de formularios Windows Forms en Internet Explorer, dado que existen soluciones mejores para hospedar controles en la Web. Por tanto, se han quitado de .NET Framework los ensamblados IEHost.dll e IEExec.exe. Puede usar las siguientes tecnologías para el desarrollo de controles personalizados en aplicaciones web:

* Puede crear una aplicación de Silverlight y configurarla para que se ejecute fuera del explorador. Para obtener más información, vea Out-of-Browser Support (Compatibilidad fuera del explorador).
* Puede compilar una aplicación de explorador XAML (XBAP) para aprovechar las ventajas de las funciones de WPF (requiere .NET Framework en los equipos cliente). Para obtener más información, vea Información general sobre las aplicaciones de explorador XAML de WPF.
Métodos HtmlEncode y UrlEncode Los métodos HtmlEncode y UrlEncode de las clases HttpUtility y HttpServerUtility se han actualizado para codificar el carácter de comilla simple (') como se indica a continuación:

* El método HtmlEncode codifica las instancias de la comilla simple como &#39;
* El método UrlEncode codifica las instancias de la comilla simple como %27
Busque en el código los lugares en los que usa los métodos HtmlEncode y UrlEncode y asegúrese de que el cambio en la codificación no produce un cambio que afecte a la aplicación.
Errores HttpException en aplicaciones de ASP.NET 2.0 Una vez que se ha habilitado ASP.NET 4 en IIS 6, las aplicaciones de ASP.NET 2.0 que se ejecutan en IIS 6 (en Windows Server 2003 o Windows Server 2003 R2) podrían generar errores como el siguiente: System.Web.HttpException: Path '/[yourApplicationRoot]/eurl.axd/[Value]' was not found. * Si no se requiere ASP.NET 4 para ejecutar el sitio web, vuelva a asignar el sitio de modo que use ASP.NET 2.0 en su lugar.

o bien

* Si se requiere ASP.NET 4 para ejecutar el sitio web, mueva los directorios virtuales secundarios de ASP.NET 2.0 a otro sitio web que esté asignado a ASP.NET 2.0.

o bien

* Deshabilite las direcciones URL sin extensión. Para obtener más información, vea "ASP.NET 2.0 Applications Might Generate HttpException Errors That Reference eurl.axd" (Las aplicaciones de ASP.NET 2.0 pueden generar errores HttpException que hacen referencia a eurl.axd) en el documento ASP.NET 4 Breaking Changes (Cambios importantes de ASP.NET 4) en el sitio web de ASP.NET.
Tipos de pertenencia Algunos tipos (por ejemplo, MembershipProvider) que se usan en la pertenencia a ASP.NET se han movido del ensamblado System.Web.dll al ensamblado System.Web.ApplicationServices.dll. Estos tipos se han movido para resolver las dependencias de capas de arquitectura entre los tipos del cliente y de las SKU de .NET Framework extendidas. Las bibliotecas de clases que se han actualizado desde versiones anteriores de ASP.NET y que usan tipos de pertenencia movidos podrían no compilarse cuando se usan en un proyecto de ASP.NET 4. En ese caso, agregue una referencia a System.Web.ApplicationServices.dll en el proyecto de biblioteca de clases.
Cambios en el control Menu Los cambios en el control Menu provocan el siguiente comportamiento:

* Si MenuRenderingMode está establecido en List, o si MenuRenderingMode está establecido en Default y ControlRenderingCompatibilityVersion está establecido en 4.0 o una versión posterior, la propiedad PopOutImageUrl no tiene ningún efecto.
* Si la ruta de acceso que se establece en las propiedades StaticPopOutImageUrl y DynamicPopOutImageUrl contiene una barra diagonal inversa (\), las imágenes no se representan. (En versiones anteriores de ASP.NET, la ruta de acceso podría incluir una barra diagonal inversa).
* En lugar de establecer la propiedad PopOutImageUrl para los elementos de menú individuales, establezca las propiedades StaticPopOutImageUrl o DynamicPopOutImageUrl del control primario Menu.

o bien

Establezca MenuRenderingMode en Table, o establezca MenuRenderingMode en Default y ControlRenderingCompatibilityVersion en 3.5. Esta configuración hace que el control Menu use el diseño basado en la tablas HTML que se usaba en versiones anteriores de ASP.NET.
* Si la ruta de acceso de la propiedad StaticPopOutImageUrl o DynamicPopOutImageUrl contiene una barra diagonal inversa (\), sustitúyala por un carácter de barra diagonal (/).
Ensamblado móvil en el archivo Web.config En versiones anteriores de ASP.NET, se incluía una referencia al ensamblado System.Web.Mobile.dll en el archivo raíz Web.config en la sección assemblies de system.web/compilation. Para mejorar el rendimiento, se ha quitado la referencia a este ensamblado.

Nota: El ensamblado System.Web.Mobile.dll y los controles móviles de ASP.NET están incluidos en ASP.NET 4, pero están en desuso.
Si quiere usar tipos de este ensamblado, agregue una referencia al ensamblado en el archivo raíz Web.config o en un archivo de aplicación Web.config.
Almacenamiento en caché de resultados En ASP.NET 1.0, un error hacía que las páginas en caché que especificaban Location="ServerAndClient" como valor de la caché de resultados emitiesen un encabezado HTTP Vary:* en la respuesta. Como consecuencia, se indicaba a los exploradores de cliente que nunca almacenasen en caché la página localmente. En ASP.NET 1.1 se agregó el método SetOmitVaryStar, al que se podía llamar para suprimir el encabezado Vary:*. A pesar de ello, los informes de errores sugieren que los desarrolladores no son conscientes del comportamiento de SetOmitVaryStar.

En ASP.NET 4, ya no se emite el encabezado HTTP Vary:* desde las respuestas que especifican la directiva siguiente:

<%@ OutputCache Location="ServerAndClient" %>

Como resultado, ya no es necesario el método SetOmitVaryStar para suprimir el encabezado Vary:*. En las aplicaciones que especifican "ServerAndClient" para el atributo Location, las páginas se podrán almacenar en caché en el explorador sin necesidad de llamar a SetOmitVaryStar.
Si las páginas de la aplicación deben emitir Vary:*, llame al método AppendHeader como se muestra en el ejemplo siguiente:

System.Web.HttpResponse.AppendHeader("Vary","*");

Como alternativa, puede cambiar el valor del atributo Location de la caché de resultados a "Server".
Análisis de página El analizador de páginas de ASP.NET para páginas web (archivos .aspx) y controles de usuario (archivos .ascx) es más estricto en ASP.NET 4 que en versiones anteriores de ASP.NET, y marca como no válido un mayor porcentaje de marcado que en versiones anteriores. Examine los mensajes de error que se producen cuando se ejecuta una página y corrija los errores derivados de un marcado no válido.
Tipos de Passport La compatibilidad con Passport integrada en ASP.NET 2.0 está obsoleta y no se admite debido a los cambios que se han producido en Passport (ahora Live ID SDK). Como resultado, los tipos relacionados con Passport en System.Web.Security ahora se marcan con el atributo ObsoleteAttribute. Cambie el código que use tipos de Passport en el espacio de nombres System.Web.Security (por ejemplo, PassportIdentity) para que use el SDK de Windows Live ID.
Información de PathInfo en la propiedad FilePath ASP.NET 4 ya no incluye el valor PathInfo en los valores devueltos desde propiedades como FilePath, AppRelativeCurrentExecutionFilePath y CurrentExecutionFilePath. Ahora, la información de PathInfo está disponible en PathInfo. Por ejemplo, veamos el siguiente fragmento de dirección URL:

/testapp/Action.mvc/SomeAction

En versiones anteriores de ASP.NET, las propiedades HttpRequest tienen los valores siguientes:

* FilePath: /testapp/Action.mvc/SomeAction
* PathInfo: (vacío)

En cambio, en ASP.NET 4, las propiedades HttpRequest tienen los siguientes valores:

* FilePath: /testapp/Action.mvc
* PathInfo: SomeAction
Busque en el código los lugares en los que las propiedades de la clase HttpRequest deben devolver información de la ruta de acceso y cambie el código de modo que refleje los cambios en la manera en que se devuelve la información de la ruta de acceso.
Validación de solicitudes Para mejorar la validación de solicitudes, la validación de solicitudes de ASP.NET se invoca antes en el ciclo de vida de la solicitud. Como resultado, la validación de solicitudes se ejecuta para las solicitudes que no son de archivos .aspx, como las llamadas al servicio web y los controladores personalizados. La validación de solicitudes también estará activa cuando se ejecuten módulos HTTP personalizados en la canalización de procesamiento de solicitudes.

Como resultado de este cambio, las solicitudes de recursos que no sean archivos .aspx podrían producir errores de validación de solicitudes. El código personalizado que se ejecuta en la canalización de solicitud (por ejemplo, los módulos HTTP personalizados) también podría producir errores de validación de solicitudes.
Si es necesario, puede revertir al comportamiento anterior, en el que solo las páginas .aspx desencadenan la validación de solicitudes. Para ello, use el valor siguiente en el archivo de configuración web:

<httpRuntime requestValidationMode="2.0" />

Advertencia: Si revierte al comportamiento anterior, asegúrese de que todo el código de los controladores, los módulos y el resto de código personalizado realice comprobaciones en busca de las entradas HTTP potencialmente no seguras que podrían ser vectores de ataque XSS.
Enrutamiento Si crea un sitio web del sistema de archivos en Visual Studio 2010 y dicho sitio web se encuentra en una carpeta que contiene un punto (.) en el nombre de carpeta, el enrutamiento de direcciones URL no funcionará de forma confiable. Se devolverá un error HTTP 404 desde algunas rutas de acceso virtuales. Esto se debe a que Visual Studio 2010 inicia el Servidor de desarrollo de Visual Studio mediante una ruta de acceso incorrecta para el directorio virtual raíz. * En la página Propiedades del sitio web basado en archivos, cambie el atributo Virtual Path a "/".

o bien

* Cree un proyecto de aplicación web en lugar de un proyecto de sitio web. Los proyectos de aplicación web no tienen este problema, y el enrutamiento de direcciones URL funciona incluso si el nombre de la carpeta del proyecto tiene un punto.

o bien

* Cree un sitio web basado en HTTP que se hospede en IIS. Los sitios web hospedados en IIS pueden tener puntos en la ruta de acceso virtual, así como en la carpeta de archivos de proyecto.
Sitios de SharePoint Si intenta ejecutar un sitio web de ASP.NET 4 que se implementa como un elemento secundario de un sitio web de SharePoint que contiene un nivel de confianza parcial personalizado denominado WSS_Minimal, verá el siguiente error:

Could not find permission set named 'ASP.Net'.
Actualmente, ninguna versión de SharePoint es compatible con ASP.NET. Como resultado, no debe intentar ejecutar un sitio web de ASP.NET 4 como un elemento secundario de un sitio web de SharePoint.
Estándares de XHTML 1.1 Para habilitar el cumplimiento de XHTML 1.1 en sitios web nuevos, los controles de ASP.NET en .NET Framework 4 generarán código HTML compatible con XHTML 1.1. Esta representación se habilita mediante la opción siguiente en el archivo Web.config dentro del elemento <system.Web>:

<pages controlRenderingCompatibilityVersion="4.0"/>

Esta opción está establecida de forma predeterminada en 4.0. Los proyectos web que se actualizan desde Visual Studio 2008 tienen habilitado el valor 3.5 para la compatibilidad.
Ninguno.

Principal

Características generales

Característica Diferencias respecto a 3.5 SP1 Cambios recomendados
CardSpace Ya no se incluye Windows CardSpace en .NET Framework, sino que se proporciona por separado. Descargue Windows CardSpace desde el Centro de descarga de Microsoft.
Archivos de configuración Se han realizado correcciones en el modo en que .NET Framework accede a los archivos de configuración de la aplicación. Si su archivo de configuración de la aplicación se denomina application-name.config, cambie el nombre a application-name.exe.config. Por ejemplo, cambie el nombre de MyApp.config a MyApp.exe.config.
Compilador de código de C# Las clases Compiler, CompilerError y ErrorLevel que se encontraban en el espacio de nombres Microsoft.CSharp ya no están disponibles y su ensamblado (cscompmgd.dll) ya no se incluye en .NET Framework. Use la clase CodeDomProvider y otras clases en el espacio de nombres System.CodeDom.Compiler. Para obtener más información, vea Usar CodeDOM.
Hospedaje (API no administrada) Para mejorar las capacidades de hospedaje, algunas de las API de activación de hospedaje han quedado en desuso. Las características de ejecución en paralelo en proceso permiten que una aplicación cargue e inicie varias versiones de .NET Framework en el mismo proceso. Por ejemplo, puede ejecutar aplicaciones que carguen complementos (o componentes) basados en .NET Framework 2.0 SP1 y complementos basados en .NET Framework 4 en el mismo proceso. Los componentes anteriores seguirán usando la versión anterior de .NET Framework y los componentes nuevos usarán la versión nueva de .NET Framework. Use las configuraciones descritas en Ejecución en paralelo y en proceso.
Nuevo modelo de seguridad La directiva de seguridad de acceso del código (CAS) se ha desactivado y se ha reemplazado por un modelo simplificado, como se describe en Cambios de seguridad en .NET Framework 4. Puede que deba realizar modificaciones si depende de CAS en sus aplicaciones. Para obtener más información, vea Compatibilidad con la directiva de seguridad de acceso del código y migración.

Fecha y hora

Espacio de nombres: System

ensamblado: mscorlib (en mscorlib.dll)

Característica Diferencias respecto a 3.5 SP1 Cambios recomendados
Horario de verano Para ser coherentes con el reloj del sistema, las propiedades de tiempo (como Local y Now) ahora usan las reglas del sistema operativo, en lugar de otros datos de .NET Framework, para las operaciones de horario de verano. Ninguno.
Aplicar formato a cadenas Para admitir el formato que tiene en cuenta la referencia cultural, la estructura TimeSpan incluye nuevas sobrecargas de los métodos ToString, Parse y TryParse, además de los nuevos métodos ParseExact y TryParseExact. Ninguno.

Globalización

Para obtener una lista de las nuevas referencias culturales neutras y específicas, vea Novedades de la globalización y localización.

Espacio de nombres: System.Globalization

ensamblado: mscorlib (en mscorlib.dll)

Característica Diferencias respecto a 3.5 SP1 Cambios recomendados
Nombres de referencias culturales Los cambios de nombre siguientes afectan a las referencias culturales de alemán, divehi y afrikáans:

* CurrencyEnglishName: El nombre de la moneda de la referencia cultural de alemán (Suiza) (de-CH) ha cambiado de "sFr." a "Fr.".
* LongDatePattern: el patrón de fecha larga de la referencia cultural de divehi (Maldivas) (dv-MV) ha cambiado de "dd/MMMM/aaaa" a "dd/MM/aaaa".
* PMDesignator: el designador P.M. de la referencia cultural de afrikáans (Sudáfrica) (af-ZA) ha cambiado de "nm" a "PM".
Tenga en cuenta los cambios en los nombres de las referencias culturales.
Parámetro LCID Para ser coherente con el comportamiento esperado en la configuración del servidor de automatización, CLR ya no pasa la referencia cultural actual para el parámetro LCID a las aplicaciones basadas en COM no administradas. En su lugar, pasa 1033 (en-us) para la referencia cultural. No es necesaria ninguna modificación, excepto para las aplicaciones nativas que requieren una referencia cultural específica.
Tipos de referencia cultural obsoletos Los tipos de referencia cultural CultureTypes y CultureTypes están obsoletos.

Para garantizar la compatibilidad con versiones anteriores, CultureTypes ahora devuelve las referencias culturales neutras y específicas incluidas en la versión anterior de .NET Framework, y CultureTypes ahora devuelve una lista vacía.
Use otros valores de la enumeración CultureTypes.
Recuperar la referencia cultural A partir de Windows 7, .NET Framework 4 recupera la información de referencia cultural del sistema operativo, en lugar de almacenar los propios datos. Además, .NET Framework se sincroniza con Windows para ordenar los datos y aplicarles mayúsculas y minúsculas. Ninguno.
Estándares de Unicode 5.1 Ahora, .NET Framework admite todos los caracteres de Unicode 5.1, lo que supone aproximadamente 1400 caracteres más. Entre los caracteres adicionales se incluyen nuevos símbolos, flechas, marcas diacríticas, puntuación, símbolos matemáticos, ideogramas y trazos de CJK, caracteres numéricos adicionales de malayalam y telugu, y varios caracteres de birmano, latino, árabe, griego, mongol y cirílico. Los nuevos scripts siguientes son compatibles con Unicode 5.1: caracteres de sundanés, lepcha, ol chiki, vai, saurashtra, kayah li, rejang, gurmukhi, odia, tamil, telugu, malayalam y cham. Ninguno.

Excepciones

Espacios de nombres: System, System.Runtime.ExceptionServices

ensamblado: mscorlib (en mscorlib.dll)

Característica Diferencias respecto a 3.5 SP1 Cambios recomendados
Excepciones para el estado de proceso dañado CLR ya no entrega excepciones para el estado de proceso dañado a controladores de excepciones en código administrado. Estas excepciones indican que el estado de un proceso está dañado. No se recomienda ejecutar la aplicación en este estado.

Para obtener más información, vea HandleProcessCorruptedStateExceptionsAttribute y la entrada Controlar excepciones de estado dañado en MSDN Magazine.
Excepciones del motor de ejecución ExecutionEngineException está ahora obsoleto, ya que una excepción detectable permitirá que un proceso inestable siga ejecutándose. Este cambio mejora la previsibilidad y la confiabilidad en el tiempo de ejecución. Use InvalidOperationException para indicar la condición.

Reflexión

Espacio de nombres: System.Reflection

ensamblado: mscorlib (en mscorlib.dll)

Característica Diferencias respecto a 3.5 SP1 Cambios recomendados
Algoritmos hash de ensamblado La propiedad HashAlgorithm ahora devuelve AssemblyHashAlgorithm, ya que el tiempo de ejecución no conoce el algoritmo hash del ensamblado al que se hace referencia cuando no carga el ensamblado. (Esto se refiere al uso de la propiedad en un ensamblado de referencia como el devuelto por el método GetReferencedAssemblies). Ninguno.
Carga de ensamblados Para evitar la carga redundante de ensamblados y ahorrar espacio de direcciones virtuales, CLR ahora carga los ensamblados únicamente mediante la función MapViewOfFile de Win32. Ya no llama también a la función LoadLibrary.

Este cambio afecta a las aplicaciones de diagnóstico de las maneras siguientes:

* ProcessModuleCollection ya no contendrá módulos de una biblioteca de clases (archivo .dll), que se obtienen de una llamada a Process.GetCurrentProcess().Modules.
* Las aplicaciones de Win32 que usan la función EnumProcessModules no podrán visualizar una enumeración de todos los módulos administrados.
Ninguno.
Tipo declarativo La propiedad DeclaringType ahora devuelve null correctamente cuando el tipo no tiene un tipo declarativo. Ninguno.
Delegados Un delegado ahora produce una ArgumentNullException en lugar de una NullReferenceException cuando se pasa un valor null al constructor del delegado. Asegúrese de que el control de excepciones capture ArgumentNullException.
Cambio en la ubicación de la caché global de ensamblados En el caso de los ensamblados de .NET Framework 4, la caché global de ensamblados se ha movido del directorio de Windows (%WINDIR%) al subdirectorio de Microsoft.Net (%WINDIR%\Microsoft.Net). Los ensamblados de las versiones anteriores permanecen en el directorio anterior.

La enumeración ASM_CACHE_FLAGS no administrada contiene la nueva marca ASM_CACHE_ROOT_EX. Esta marca obtiene la ubicación de la caché de los ensamblados de .NET Framework 4, que puede obtenerse mediante la función GetCachePath.
Ninguno, siempre y cuando las aplicaciones no usen rutas de acceso explícitas a los ensamblados, lo que no se recomienda.
Herramienta Caché global de ensamblados La herramienta Caché global de ensamblados (Gacutil.exe) ya no es compatible con el visor de complementos de shell. Ninguno.

Interoperabilidad

Espacio de nombres: System.Runtime.InteropServices

ensamblado: mscorlib (en mscorlib.dll)

Característica Diferencias respecto a 3.5 SP1 Cambios recomendados
Longitud del búfer (API no administrada) Para ahorrar memoria, la funcionalidad del parámetro pBufferLengthOffset para el método ICorProfilerInfo2::GetStringLayout ha cambiado para que coincida con el parámetro pStringLengthOffset. Ambos parámetros ahora apuntan a la ubicación de desplazamiento de la longitud de la cadena. La longitud del búfer se ha quitado de la representación de la clase String. Quite todas las dependencias de la longitud del búfer.
Depuración JIT Para simplificar el registro de la depuración Just-In-Time (JIT), el depurador de .NET Framework ahora solo usa la clave del Registro AeDebug, que controla el comportamiento de la depuración JIT para el código nativo. Este cambio tiene como resultado lo siguiente:

* Ya no se pueden registrar dos depuradores diferentes para el código administrado y nativo.
* Ya no se puede iniciar el depurador automáticamente para un proceso no interactivo, pero se le puede preguntar al usuario en caso de un proceso interactivo.
* Ya no se notificará cuando el depurador no se inicie o cuando no haya un depurador registrado que se debe iniciar.
* Las directivas de inicio automático que dependen de la interactividad de la aplicación ya no se admiten.
Ajuste las operaciones de depuración según sea necesario.
Invocación de plataforma Ahora, para mejorar el rendimiento de la interoperabilidad con código no administrado, las convenciones de llamada incorrectas en una invocación de plataforma hacen que la aplicación no funcione correctamente. En versiones anteriores, la capa de serialización resolvía estos errores hacia arriba en la pila. Cuando depure las aplicaciones en Microsoft Visual Studio, se le avisará de estos errores para que pueda corregirlos.

Si tiene archivos binarios que no se pueden actualizar, puede incluir el elemento <NetFx40_PInvokeStackResilience> en el archivo de configuración de la aplicación para permitir que los errores de llamada se resuelvan hacia arriba en la pila, como en las versiones anteriores. Aun así, esto puede afectar al rendimiento de la aplicación.
Interfaces eliminadas (API no administrada) Para evitar confusiones a los desarrolladores, se han quitado las interfaces siguientes porque no proporcionaban escenarios útiles en tiempo de ejecución y CLR no proporcionaba o no aceptaba implementaciones:

* INativeImageINativeImageDependency
* INativeImageInstallInfo
* INativeImageEvaluate
* INativeImageConverter
* ICorModule
* IMetaDataConverter
Ninguno.

Datos

En esta sección se describen los problemas de migración al usar conjuntos de datos y los clientes SQL, Entity Framework, LINQ to SQL y Servicios de datos de WCF (antes conocido como ADO.NET Data Services).

DataSet y el cliente SQL

En la tabla siguiente se describen las mejoras en las características que antes tenían limitaciones u otros problemas.

Espacios de nombres: System.Data, System.Data.Objects.DataClasses, System.Data.SqlClient

Ensamblados: System.Data (en System.Data.dll), System.Data.Entity (en System.Data.Entity.dll)

Característica Diferencias respecto a 3.5 SP1
Escenarios POCO La interfaz IRelatedEnd tiene nuevos métodos para mejorar su uso en escenarios POCO (objeto CLR estándar). Estos nuevos métodos toman como parámetro una entidad Object en lugar de una entidad IEntityWithRelationships.
Edición de filas El método IndexOf, tal como lo implementa la clase DataView, ahora devuelve correctamente el valor de una fila que se está editando, en lugar de devolver -1.
Eventos Ahora se genera el evento PropertyChanged cuando una fila se encuentra en un estado modificado y se llama al método RejectChanges. Este cambio hace más fácil crear controles de interfaz de usuario que exponen el contenido de un objeto DataSet.
Excepciones El método Prepare ahora produce una InvalidOperationException cuando una conexión no se establece o no se abre, en lugar de una NullReferenceException.
Vistas de asignación Los errores de asignación de vistas de consulta ahora se detectan en tiempo de diseño, en lugar de producir una NullReferenceException en tiempo de ejecución.

La validación de asignación ahora detecta el error que hace que se asignen dos conjuntos de asociaciones del esquema conceptual (CSDL) a la misma columna.
Transacciones Si una aplicación intenta ejecutar una instrucción en una conexión después de que se haya completado una transacción (incluido si se ha anulado o revertido), ahora se produce una InvalidOperationException. En las versiones anteriores no se producía una excepción y se podían ejecutar comandos adicionales, incluso en caso de que se anulase una transacción.

Entity Framework

En la tabla siguiente se describen las mejoras en las características que antes tenían limitaciones u otros problemas.

Espacios de nombres: System.Data, System.Data.Objects, System.Data.Objects.DataClasses

Ensamblados: System.Data.Entity (en System.Data.Entity.dll)

Característica Diferencias respecto a 3.5 SP1
Objetos de entidad Ahora hay paridad entre el método Detach y el estado del objeto de entidad cuando se llama al método SaveChanges. Esta coherencia mejorada evita que se produzcan excepciones inesperadas.
Entity SQL Se han mejorado las reglas para las resoluciones de identificadores de Entity SQL.

El analizador de Entity SQL ha mejorado la lógica para resolver identificadores con varias partes.
Anotaciones estructurales Entity Framework ahora reconoce las anotaciones estructurales.
Consultas Se han realizado las siguientes mejoras en las consultas:

* Las consultas GroupBy que usan una clave NULL en una colección vacía no devolverán ninguna fila, independientemente de si hay selecciones adicionales en la consulta.
* El código SQL generado en consultas LINQ y Entity SQL ahora tratan los parámetros de cadena como valores no Unicode de forma predeterminada.

LINQ to SQL

En la tabla siguiente se describen las mejoras en las características que antes tenían limitaciones u otros problemas.

Espacio de nombres: System.Data.Linq

Ensamblado: System.Data.Linq (en System.Data.Linq.dll)

Característica Diferencias respecto a 3.5 SP1
Eventos Una colección EntitySet<TEntity> ahora genera el evento ListChanged para agregar y suprimir operaciones si EntitySet<TEntity> no se ha cargado. También genera este evento cuando la colección está cargada.
Consultas Skip(0) ya no se omite en las consultas de LINQ to SQL. Como resultado, las consultas que tienen este método pueden comportarse de manera diferente. Por ejemplo, en algunos casos, se requiere una cláusula OrderBy con Skip(0), y ahora la consulta iniciará una excepción NotSupportedException si la cláusula OrderBy no se ha incluido.

Servicios de datos de WCF

En la tabla siguiente se describen las mejoras en las características que antes tenían limitaciones u otros problemas.

Espacios de nombres: System.Data.Services, System.Data.Services.Client, System.Data.Services.Common, System.Data.Services.Providers

Ensamblados: System.Data.Services (en System.Data.Services.dll), System.Data.Services.Client (en System.Data.Services.Client.dll)

Característica Diferencias respecto a 3.5 SP1
Contenido binario por lotes Servicios de datos de WCF admite ahora contenido binario por lotes en las solicitudes y las respuestas.
Interceptores de cambios Ahora se ejecutan interceptores de cambios para una solicitud de eliminación.

Un interceptor de cambios es un método que se ejecuta cada vez que el servidor recibe una solicitud para modificar una entidad del conjunto de entidades. Se ejecuta antes de que se ejecute la solicitud entrante. El interceptor de cambios proporciona acceso a la entidad que se va a cambiar y a la operación que se realiza en él.
Excepciones Las condiciones siguientes ahora producen excepciones más útiles, en lugar de una NullReferenceException:

* Una TimeoutException cuando se agota el tiempo de espera de una llamada a un servicio de datos.
* Una DataServiceRequestException cuando se realiza una solicitud incorrecta a un servicio de datos.

En las aplicaciones, debe cambiar el control de excepciones para que detecte las nuevas excepciones.
Encabezados Se han realizado las siguientes mejoras en los encabezados:

* Servicios de datos de WCF ahora rechaza correctamente los encabezados eTag que tengan un valor no especificado.
* Servicios de datos de WCF ahora devuelve un error y no ejecuta una solicitud de eliminación a un vínculo cuando hay un encabezado if-* en la solicitud.
* Servicios de datos de WCF ahora devuelve un error al cliente en el formato (Atom, JSON) que el cliente haya especificado en el encabezado Accept.
Lector JSON El lector de Notación de objetos JavaScript (JSON) ahora devuelve correctamente un error cuando lee el carácter de escape de barra diagonal inversa única ("\") al procesar cargas de JSON enviadas a Servicios de datos de WCF.
Combinaciones Se han realizado las siguientes mejoras en la enumeración MergeOption:

* La opción de combinación MergeOption ya no modifica la entidad en el cliente como resultado de una respuesta subsiguiente de un servicio de datos.
* La opción MergeOption ahora es coherente entre SQL dinámico y las actualizaciones basadas en procedimientos almacenados.
Solicitudes La llamada al método OnStartProcessingRequest ahora se realiza antes de procesar una solicitud a los servicios de datos. Esto permite que la solicitud funcione correctamente para los servicios ServiceOperation.
Secuencias Servicios de datos de WCF ya no cierra la secuencia subyacente para las operaciones de lectura y escritura.
URI Se han corregido las secuencias de escape de los URI del cliente de Servicios de datos de WCF.

Windows Communication Foundation (WCF)

En la tabla siguiente se describen las mejoras en las características que antes tenían limitaciones u otros problemas.

Característica Diferencias respecto a 3.5 SP1
Archivos de configuración Para habilitar la herencia de comportamientos mediante la jerarquía de archivos de configuración, WCF ahora permite combinar archivos de configuración.

El modelo de herencia de configuración se ha ampliado para permitir que los usuarios definan los comportamientos que se aplicarán a todos los servicios que se ejecutan en el equipo.

Puede encontrar cambios de comportamiento si hay comportamientos con el mismo nombre en distintos niveles de la jerarquía.
Hospedaje de servicios Ya no se puede especificar el elemento de configuración <serviceHostingEnvironment> en el nivel de servicio mediante la adición del atributo allowDefinition="MachineToApplication" a la definición de elemento.

La acción de especificar el elemento <serviceHostingEnvironment> en el nivel de servicio es técnicamente incorrecta y provoca un comportamiento incoherente.

Windows Presentation Foundation (WPF)

Aplicaciones

Espacios de nombres: System.Windows, System.Windows.Controls

Ensamblados: PresentationFramework (en PresentationFramework.dll)

Característica Diferencias respecto a 3.5 SP1 Cambios recomendados
Control de excepciones Para que los errores se detecten antes, WPF produce una TargetInvocationException y establece la propiedad InnerException en las excepciones críticas, como NullReferenceException, OutOfMemoryException, StackOverflowException y SecurityException, en lugar de capturar la excepción original. Ninguno.
Recursos vinculados Para facilitar la vinculación, los archivos de recursos (como las imágenes) que se encuentran en una ubicación distinta de la estructura de carpetas del proyecto usan la ruta de acceso completa del archivo de recursos en lugar de simplemente su nombre de archivo como identificador de recurso cuando se compila la aplicación. La aplicación podrá encontrar los archivos en tiempo de ejecución. Ninguno.
Aplicaciones de confianza parcial Por motivos de seguridad, las aplicaciones basadas en Windows que se ejecutan en confianza parcial y contienen un control WebBrowser o un control Frame que contiene código HTML producirán una SecurityException cuando se cree el control.

Las aplicaciones de explorador producirán una excepción y mostrarán un mensaje si se cumplen todas las condiciones siguientes:

* La aplicación se ejecuta en Firefox.
* La aplicación se ejecuta en confianza parcial en la zona de Internet desde sitios que no son de confianza.
* La aplicación contiene un control WebBrowser o un control Frame que contiene código HTML.

Las aplicaciones que se ejecutan desde sitios de confianza o desde la zona de intranet no se verán afectadas.
En las aplicaciones de explorador, puede mitigar este cambio. Para ello, lleve a cabo una de las acciones siguientes:

* Ejecute la aplicación de explorador en plena confianza.
* Haga que los clientes agreguen el sitio de la aplicación a la zona de sitios de confianza.
Diccionarios de recursos Para mejorar los diccionarios de recursos de nivel de tema e impedir que cambien, los recursos inmovilizables que se definen en un diccionario de recursos y se combinan en un diccionario de nivel de tema ahora siempre están marcados como inmovilizados y son inmutables. Este es el comportamiento esperado para los recursos inmovilizables. Las aplicaciones que modifican un recurso definido en un diccionario combinado de nivel de tema deben clonar el recurso y modificar la copia clonada. Como alternativa, se puede marcar el recurso como x:Shared="false" para que ResourceDictionary cree una copia cada vez que se consulte el recurso.
Windows 7 Para que las aplicaciones de WPF funcionen mejor en Windows 7, se han realizado las siguientes mejoras para corregir el comportamiento de una ventana:

* Los estados de acoplar y gestos ahora funcionan según lo esperado en función de las interacciones del usuario.
* Los comandos de la barra de tareas Ventanas en cascada, Mostrar ventanas apiladas y Mostrar ventanas en paralelo ahora tienen el comportamiento correcto y actualizan las propiedades adecuadas.
* Las propiedades Top, Left, Width y Height de una ventana maximizada o minimizada contienen ahora la ubicación de restauración correcta de la ventana en lugar de otros valores, según el monitor.
Ninguno.
Estilo de Windows y transparencia Se produce una InvalidOperationException si se intenta establecer WindowStyle en un valor distinto de WindowStyle cuando AllowsTransparency es true y WindowState es WindowState. Si necesita cambiar WindowStyle cuando AllowsTransparency es true, puede llamar a la función SetWindowLongPtr de Win32.
Visor de XPS WPF no incluye Microsoft XML Paper Specification Essentials Pack (XPSEP). XPSEP se incluye con Windows 7 y Windows Vista.

En un equipo que ejecuta Windows XP sin .NET Framework 3.5 SP1 instalado, la acción de imprimir mediante una API de WPF distinta de PrintDialog se basará en WINSPOOL. No se notificarán algunas funciones de la impresora y no se aplicarán algunos valores de configuración de la impresora durante la impresión.
Si es necesario, instale Microsoft XML Paper Specification Essentials Pack.

Controles

Espacios de nombres: System.Windows, System.Windows.Controls, System.Windows.Data, System.Windows.Input

Ensamblados: PresentationFramework (en PresentationFramework.dll), PresentationCore (en PresentationCore.dll), WindowsBase (en WindowsBase.dll)

Característica Diferencias respecto a 3.5 SP1 Cambios recomendados
Cuadros de diálogo Para mejorar la confiabilidad, se llama al método ShowDialog en el mismo subproceso que ha creado el control FileDialog. Asegúrese de crear un control FileDialog y llamar al método ShowDialog en el mismo subproceso.
Ventanas flotantes Para corregir la lógica de restauración del foco que reactiva incorrectamente una ventana flotante (lo que hace que parezca un cuadro de diálogo modal), ahora se impide la restauración del foco si el candidato no es un elemento secundario de la ventana. Ninguno.
Elementos de colecciones Cuando un elemento se mueve o se agrega a una colección subyacente, aparece en CollectionView en la misma ubicación relativa si CollectionView no está ordenada. Esto proporciona coherencia entre la posición del elemento en la colección y la CollectionView asociada. Use el método ContainerFromItem o IndexOf para buscar la ubicación de un elemento en CollectionView, en lugar de depender de una ubicación fija de un elemento.
Diseños Para eliminar la realización innecesaria de nuevos diseños, la acción de cambiar ShowsNavigationUI ya no invalida el diseño ni provoca otro cálculo de diseño. Si espera que se provoque otro cálculo de diseño al cambiar ShowsNavigationUI, llame a InvalidateVisual después de establecer la propiedad.
Menús Para habilitar texto ClearType en menús emergentes, se han realizado modificaciones en la clase ControlTemplate y en el control MenuItem y en otros controles. Las aplicaciones no deben depender de la estructura visual de las plantillas de control. Solo los elementos con nombre de ControlTemplate forman parte del contrato público. Si una aplicación debe encontrar un objeto determinado en ControlTemplate, busque en el árbol visual un tipo específico, en lugar de depender de una ubicación fija de un objeto en el árbol.
Navegación Si Frame navega directamente a una ubicación, la propiedad IsNavigationInitiator es true después de la navegación inicial. Este cambio impide que se produzcan eventos adicionales durante los escenarios de arranque. Ninguno.
Elementos emergentes Ahora se puede llamar al delegado CustomPopupPlacementCallback varias veces durante un cálculo de diseño, en lugar de una sola vez. Si su delegado CustomPopupPlacementCallback calcula la posición de un elemento Popup en función de su posición anterior, vuelva a calcular la posición únicamente si los valores de los parámetros popupSize, targetSize o offset cambian.
Valores de propiedades Ahora el método SetCurrentValue le permite establecer una propiedad en un valor efectivo, aunque sigue respetando todos los enlaces, estilos o desencadenadores que afecten a la propiedad. Los autores de controles deben usar SetCurrentValue siempre que el valor de propiedad cambie como efecto secundario de otra acción, incluida la manipulación por parte del usuario.
Cuadros de texto Por motivos de seguridad, se produce un error de manera silenciosa en los métodos Copy y Cut cuando se les llama en confianza parcial.

Además, la ejecución mediante programación de la propiedad Copy o Cut en un control que herede de TextBoxBase se bloqueará en confianza parcial. Esto no impedirá que funcionen los comandos de copiar y cortar iniciados por el usuario, como hacer clic en un botón cuya propiedad Command está enlazada a uno de estos comandos. La acción estándar de copiar y cortar mediante métodos abreviados de teclado y el menú contextual seguirá funcionando como antes en confianza parcial.
Enlace el comando Copy o Cut a una acción iniciada por el usuario, como hacer clic en un botón.

Gráficos

Espacios de nombres: System.Windows, System.Windows.Controls, System.Windows.Data, System.Windows.Input, System.Windows.Media.Effects

Ensamblados: PresentationFramework (en PresentationFramework.dll), PresentationCore (en PresentationCore.dll), WindowsBase (en WindowsBase.dll)

Característica Diferencias respecto a 3.5 SP1 Cambios recomendados
Efectos de imagen Para mejorar el rendimiento, la clase BitmapEffect y las clases que heredan de la clase BitmapEffect, aunque siguen presentes, están deshabilitadas. El efecto se representará mediante el uso de la canalización de representación acelerada por hardware si se cumplen las condiciones siguientes:

* La aplicación usa una clase DropShadowBitmapEffect o BlurBitmapEffect que tenga una propiedad de radio establecida en menos de 100 DIU.
* La tarjeta de vídeo del equipo que ejecuta la aplicación es compatible con el sombreador de píxeles 2.0.

Si no se cumplen estas condiciones, los objetos BitmapEffect no tendrán ningún efecto.

Además, Visual Studio genera una advertencia del compilador cuando encuentra el objeto BitmapEffect o una subclase.

El método PushEffect está marcado como obsoleto.
Deje de usar el objeto BitmapEffect heredado y las clases derivadas y use en su lugar las nuevas clases derivadas de Effect: BlurEffect, DropShadowEffect y ShaderEffect.

También puede crear sus propios efectos. Para ello, herede de la clase ShaderEffect.
Marcos de mapa de bits Los objetos BitmapFrame clonados ahora reciben los eventos DownloadProgress, DownloadCompleted y DownloadFailed. Esto permite que las imágenes que se descargan de Internet y se aplican al control Image mediante Style funcionen correctamente.

Verá un cambio de comportamiento únicamente si se cumplen todas las instrucciones siguientes:

* Se suscribe al evento DownloadProgress, DownloadCompleted o DownloadFailed.
* El origen de BitmapFrame está en Internet.
* BitmapFrame se clona mientras la descarga aún está en curso.
Compruebe el remitente en el controlador de eventos y tome medidas solo si el remitente es el BitmapFrame original.
Descodificación de imágenes Para impedir que no se controle una IOException cuando las imágenes no se pueden descodificar, la clase BitmapSource producirá el evento DecodeFailed cuando no descodifique una imagen. Quite el control de excepciones de IOException y use el evento DecodeFailed para comprobar si se ha producido un error en la descodificación.

Entrada

Espacios de nombres: System.Windows, System.Windows.Controls, System.Windows.Data, System.Windows.Input

Ensamblados: PresentationFramework (en PresentationFramework.dll), PresentationCore (en PresentationCore.dll), WindowsBase (en WindowsBase.dll)

Característica Diferencias respecto a 3.5 SP1 Cambios recomendados
Enlazar instancias de comandos Para proporcionar un mecanismo para enlazar instancias de comandos basadas en el modelo de vista a gestos de entrada basados en vistas, la clase InputBinding ahora hereda de Freezable en lugar de DependencyObject. Ahora, las propiedades siguientes son propiedades de dependencia:

* Command
* CommandParameter
* CommandTarget

Este cambio tiene como resultado lo siguiente:

* Los objetos InputBinding ahora se inmovilizan cuando se registran, en lugar de seguir siendo mutables.
* No se puede obtener acceso a objetos InputBinding de nivel de instancia desde varios subprocesos debido a las restricciones de la clase DependencyObject.
* No se pueden modificar los enlaces de entrada de nivel de clase después de su registro debido a las restricciones de la clase Freezable.
* No se pueden especificar enlaces de entrada en las instancias de comando que se crean en un modelo de vista.
Cree instancias independientes de una clase InputBinding en subprocesos independientes si los enlaces deben ser mutables. En caso contrario, inmovilícelos. No modifique una clase estática InputBinding de nivel de clase después de que se haya registrado.
Aplicaciones de explorador Las aplicaciones de explorador WPF (.XBAP) ahora procesan los eventos clave exactamente igual que las aplicaciones de WPF independientes para que los objetos reciban los eventos clave enrutados en el orden correcto. Ninguno.
Combinaciones de teclas inactivas WPF ofusca las teclas inactivas, que no producen ningún carácter visible, pero indica que la tecla debe combinarse con la tecla de letra siguiente para generar un carácter. Los eventos de entrada de tecla, como el evento KeyDownEvent, notifican que una tecla es inactiva mediante el establecimiento de la propiedad Key en el valor Key. Este suele ser el comportamiento esperado, ya que las aplicaciones normalmente no responden a la entrada de teclado que crea un carácter combinado. Las aplicaciones que esperan leer teclas que formaban parte de caracteres combinados ahora pueden obtener la tecla ofuscada mediante la propiedad DeadCharProcessedKey.
Administrador de foco Cuando se pasa al método FocusManager.GetFocusedElement(DependencyObject) un elemento que tiene la propiedad adjunta IsFocusScope establecida en true, el método devuelve un elemento que es el último elemento con el foco en el teclado dentro de ese ámbito del foco únicamente si el elemento devuelto pertenece al mismo objeto PresentationSource que el elemento que se pasa al método. Ninguno.

Automatización de la interfaz de usuario

Espacios de nombres: System.Windows, System.Windows.Automation.Peers, System.Windows.Automation.Provider, System.Windows.Controls, System.Windows.Data, System.Windows.Input

Ensamblados: PresentationFramework (en PresentationFramework.dll), PresentationCore (en PresentationCore.dll), UIAutomationProvider (en UIAutomationProvider.dll), WindowsBase (en WindowsBase.dll)

Característica Diferencias respecto a 3.5 SP1 Cambios recomendados
Jerarquía de clases de vistas Las clases TreeViewAutomationPeer y TreeViewItemAutomationPeer heredan de ItemsControlAutomationPeer en vez de FrameworkElementAutomationPeer. Si hereda de las clases TreeViewItemAutomationPeer e invalida el método GetChildrenCore, considere la posibilidad de devolver un objeto que herede de la nueva clase TreeViewDataItemAutomationPeer.
Contenedores fuera de la pantalla Para corregir un valor devuelto incorrecto, el método IsOffscreenCore ahora devuelve correctamente false para los contenedores de elementos que se desplazan fuera de la vista. Además, el valor del método no se ve afectado por la oclusión por parte de otras ventanas o si el elemento está visible en un monitor específico. Ninguno.
Menús y objetos secundarios Para habilitar la automatización de la interfaz de usuario de los menús que contienen elementos secundarios distintos de objetos MenuItem, el método GetChildrenCore ahora devuelve el objeto AutomationPeer de un elemento objeto secundario UIElement, en lugar de un objeto MenuItemAutomationPeer. Ninguno.
Nuevas Interfaces y ensamblado Para habilitar nuevas características para la automatización de la interfaz de usuario, se han agregado las interfaces siguientes:

* IItemContainerProvider
* ISynchronizedInputProvider
* IVirtualizedItemProvider
Todos los proyectos que generan elementos de automatización de WPF del mismo nivel deben agregar una referencia explícita a UIAutomationProvider.dll.
Controles El método GetClassNameCore devuelve un valor en lugar de NULL. Por lo tanto, los controles como GridSplitter que heredan de la clase Thumb notificarán un nombre a la automatización de la interfaz de usuario. Ninguno.
Elementos virtualizados Para mejorar el rendimiento, el método GetChildrenCore devuelve solo los objetos secundarios que se encuentran realmente en el árbol visual, en lugar de todos los objetos secundarios, independientemente de si están virtualizados. Use ItemContainerPattern para iterar en todos los elementos de ItemsControlAutomationPeer.

XAML

Espacios de nombres: System.Windows, System.Windows.Controls, System.Windows.Data, System.Windows.Input, System.Windows.Markup

Ensamblados: PresentationFramework (en PresentationFramework.dll), PresentationCore (en PresentationCore.dll), WindowsBase (en WindowsBase.dll)

Característica Diferencias respecto a 3.5 SP1 Cambios recomendados
Extensión de marcado WPF ahora usa siempre correctamente el valor del método ProvideValue en lugar de devolver el objeto MarkupExtension en los casos en que se usa una extensión de marcado para establecer una propiedad o para crear un elemento en una colección. En algunos casos, una extensión de marcado podría devolverse a sí misma. Si la aplicación tiene acceso a un recurso que devolvía un objeto MarkupExtension en versiones anteriores, haga referencia al objeto que se devuelve desde ProvideValue, en lugar de al objeto MarkupExtension.
Análisis de atributos Los atributos en XAML ahora pueden tener un solo punto. Por ejemplo, lo siguiente es válido:

<Button Background="Red"/> (ningún punto)

<Button Button.Background = "Red"/> (un punto)

Lo siguiente ya no es válido:

<Button Control.Button.Background = "Red"/> (más de un punto)
Corrija los atributos XAML que tengan más de un punto.

XML

En las filas de esta tabla se describen las mejoras en las características que antes tenían limitaciones u otros problemas.

Esquemas y transformaciones

Espacios de nombres: System.Xml.Linq; System.Xml.Schema, System.Xml.XPath

Ensamblados: System.Xml (en System.Xml.dll), System.Xml.Linq (en System.Xml.Linq.dll)

Característica Diferencias respecto a 3.5 SP1
Esquemas camaleónicos Para evitar daños en los datos, los esquemas camaleónicos ahora se clonan correctamente cuando se incluyen con varios esquemas.

Los camaleónicos son aquellos que no tienen un espacio de nombres de destino y que, cuando se incluyen en otro esquema XSD, toman el espacio de nombres de destino del esquema de importación. A menudo se usan para incluir tipos comunes en un esquema.
Funciones id La función id de XSLT ahora devuelve el valor correcto en lugar de NULL cuando se pasa un objeto XmlReader a una transformación XSLT.

Si el usuario creaba un objeto XmlReader a partir de una clase LINQ to XML mediante el método CreateReader y dicho objeto XmlReader se pasaba a una transformación XSLT, todas las instancias de la función id de la transformación XSLT anteriormente devolvían el valor NULL. Este valor devuelto no se permite para la función id.
Atributo Namespace Para evitar daños en los datos, los objetos XPathNavigator ahora devuelven correctamente el nombre local del atributo x:xmlns.
Declaraciones de espacio de nombres Un objeto XmlReader en un subárbol ya no crea declaraciones de espacio de nombres duplicadas en un elemento XML.
Validación de esquemas Para evitar la validación de esquemas errónea, la clase XmlSchemaSet permite que los esquemas XSD se compilen de forma correcta y coherente. Estos esquemas pueden incluir otros esquemas. Por ejemplo, A.xsd puede incluir B.xsd, que puede incluir C.xsd. La acción de compilar alguno de estos esquemas hace que se atraviese este gráfico de dependencias.
Funciones de script La función function-available ya no devuelve incorrectamente false cuando la función está realmente disponible.
URI El método Load ahora devuelve el valor de BaseURI correcto en consultas LINQ.

Validación

Espacios de nombres: System.Xml.Linq; System.Xml.Schema, System.Xml.XPath

Ensamblados: System.Xml (en System.Xml.dll), System.Xml.Linq (en System.Xml.Linq.dll)

Característica Diferencias respecto a 3.5 SP1
Resoluciones de espacio de nombres El método ReadContentAs ya no omite la resolución IXmlNamespaceResolver que se le pasa.

En versiones anteriores, se omitía la resolución de espacio de nombres especificada y se usaba XmlReader en su lugar.
Espacio en blanco Para evitar la pérdida de datos al crear un lector, el método Create ya no descarta el espacio en blanco significativo.

La validación de XML reconoce el modo de contenido mixto, en el que el texto se puede combinar con marcado XML. En modo mixto, todo el espacio en blanco es significativo y se debe notificar.

Escritura

Espacios de nombres: System.Xml.Linq; System.Xml.Schema, System.Xml.XPath

Ensamblados: System.Xml (en System.Xml.dll), System.Xml.Linq (en System.Xml.Linq.dll)

Característica Diferencias respecto a 3.5 SP1
Referencias a entidades Para evitar daños en los datos, ya no se crean dos entidades de las referencias a entidades en los atributos XML.

Si el usuario intentaba escribir una entidad en un atributo xmlns o en los atributos xml:lang o xml:space mediante el método WriteEntityRef, se creaban dos entidades de la entidad en la salida, lo que dañaba los datos.
Control de nueva línea Para evitar daños en los datos, los objetos XmlWriter respetan la opción NewLineHandling.

Vea también