Problemas de migração do .NET Framework 4

Este artigo descreve os problemas de migração entre o .NET Framework versão 3.5 Service Pack 1 e o .NET Framework versão 4, incluindo correções, alterações para conformidade e segurança de padrões e alterações com base nos comentários dos clientes. A maioria dessas alterações não requer a modificação da programação dos seus aplicativos. Para aquelas que podem envolver modificações, confira a coluna Alterações recomendadas da tabela. Alterações notáveis são divididas por área, por exemplo, ASP.NET e WPF (Windows Presentation Foundation).

Para obter uma visão geral resumida dos problemas neste artigo, confira Guia de migração para o .NET Framework 4.

Para saber mais sobre novos recursos, confira Novidades no .NET Framework 4.

ASP.NET e Web

Namespaces: System.Web, System.Web.Mobile, System.Web.Security e System.Web.UI.WebControls

Assembly: System.Web (em System.Web.dll)

Recurso Diferenças de 3.5 SP1 Alterações recomendadas
Arquivos de definição do navegador Os arquivos de definição do navegador foram atualizados para incluir informações sobre dispositivos e navegadores novos e atualizados. Navegadores e dispositivos mais antigos como o Netscape Navigator foram removidos e navegadores e dispositivos mais novos como o Google Chrome e Apple iPhone foram adicionados.

Se seu aplicativo contiver definições do navegador personalizadas herdadas de uma das definições do navegador que foram removidas, você verá um erro.

O objeto HttpBrowserCapabilities (exposto pela propriedade da página Request.Browse) é orientada pelos arquivos de definição do navegador. Portanto, as informações retornadas ao acessar uma propriedade desse objeto no ASP.NET 4 talvez sejam diferentes das informações retornadas em uma versão anterior do ASP.NET.
Se seu aplicativo depender dos antigos arquivos de definição do navegador, será possível copiá-los da pasta a seguir:

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

No caso do ASP.NET 4, copie os arquivos para a pasta \CONFIG\Browsers correspondente. Depois de copiar os arquivos, execute a ferramenta de linha de comando Aspnet_regbrowsers.exe. Para obter mais informações, consulte o site https://www.asp.net/mobile.
Aplicativos filho em execução em diferentes versões do ASP.NET Os aplicativos ASP.NET 4 configurados como filhos de aplicativos que executam versões anteriores do ASP.NET talvez falhem ao iniciar devido a erros de configuração ou de compilação. O erro específico que ocorre depende se o aplicativo é executado no IIS 6.0 ou no IIS 7 ou no IIS 7.5. É possível fazer alterações nos arquivos de configuração dos aplicativos afetados para que o sistema de configuração reconheça corretamente o aplicativo ASP.NET 4. Para obter informações sobre as alterações que você deverá fazer, consulte a seção "ASP.NET 4 Child Applications Fail to Start When Under ASP.NET 2.0 or ASP.NET 3.5 Applications" (Aplicativos ASP.NET 4 filho falham ao iniciar nos Aplicativos ASP.NET 2.0 ou ASP.NET 3.5) no documento ASP.NET 4 Breaking Changes (Alterações recentes do ASP.NET 4) no site da Web do ASP.NET.
Alterações da ClientID A nova configuração clientIDMode no ASP.NET 4 permite especificar como o ASP.NET gera o atributo id para elementos HTML. Nas versões anteriores do ASP.NET, o comportamento padrão era equivalente à configuração AutoID do clientIDMode. A configuração padrão agora é Predictable. Para obter mais informações, consulte ASP.NET Web Server Control Identification (Identificação de controles do servidor Web do ASP.NET). Se você usar o Visual Studio para atualizar seu aplicativo do ASP.NET 2.0 ou 3.5, a ferramenta adicionará automaticamente uma configuração ao arquivo Web.config para preservar o comportamento das versões anteriores do .NET Framework. No entanto, se você atualizar um aplicativo alterando o pool de aplicativos no IIS com relação ao .NET Framework 4, o ASP.NET usará o novo modo por padrão. Para desabilitar o novo modo da ID do cliente, adicione a seguinte configuração ao arquivo Web.config:

<pages clientIDMode="AutoID" />
CAS (Segurança de Acesso do Código) Os recursos NET do ASP.NET 2.0 que foram adicionados no ASP.NET 3.5 usam o modelo CAS (Segurança de Acesso do Código) do .NET Framework 1.1 e .NET Framework 2.0. No entanto, a implementação da CAS no ASP.NET 4 foi substancialmente revisada. Como resultado, os aplicativos ASP.NET de confiança parcial que dependem de código confiável em execução no cache de assembly global talvez falhem com diversas exceções de segurança. Aplicativos de confiança parcial que dependem de grandes modificações na política de CAS do computador talvez falhem e gerem exceções de segurança também. É possível reverter aplicativos ASP.NET 4 de confiança parcial para o comportamento do ASP.NET 1.1 e 2.0 usando o novo atributo legacyCasModel no elemento trust, conforme mostrado no exemplo a seguir:

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

Importante: reverter para o modelo CAS mais antigo talvez represente menos segurança.

Para obter mais informações sobre o novo modelo de segurança de acesso do código do ASP.NET 4, consulte Segurança de acesso do código em aplicativos ASP.NET 4.
Arquivos de configuração Os arquivos de configuração raiz (o arquivo machine.config e o arquivo Web.config raiz) para .NET Framework e ASP.NET 4 foram atualizados para incluir a maioria das informações de configuração padrão encontradas nos arquivos Web.config do aplicativo no ASP .NET 3.5. Devido à complexidade dos sistemas de configuração do IIS 7 e IIS 7.5 gerenciados, executar aplicativos ASP.NET 3.5 no ASP.NET 4 e no IIS 7 e IIS 7.5 pode resultar em erros do ASP.NET ou do IIS. Atualize os aplicativos ASP.NET 3.5 para ASP.NET 4 usando as ferramentas de atualização de projeto no Visual Studio. O Visual Studio 2010 modifica automaticamente o arquivo Web.config do aplicativo ASP.NET 3.5 para conter as configurações apropriadas do ASP.NET 4.

No entanto, é possível executar aplicativos ASP.NET 3.5 usando o .NET Framework 4 sem recompilação. Nesse caso, talvez seja necessário modificar manualmente o arquivo Web.config do aplicativo antes de executá-lo no .NET Framework 4 e no IIS 7 ou 7.5. A alteração específica que é necessário ser feita depende da combinação de software com a qual você está trabalhando, incluindo as versões do SP (Service Pack). Para obter informações sobre as combinações de software possíveis afetadas por essa alteração e como resolver problemas com combinações específicas, consulte a seção "Erros de configuração relacionados à nova configuração raiz do ASP.NET 4" no documento ASP.NET 4 Breaking Changes (Alterações recentes do ASP.NET 4) no site da Web do ASP.NET.
Renderização de controles Em versões anteriores do ASP.NET, alguns controles emitiam marcação que não podiam ser desabilitadas. Por padrão, esse tipo de marcação não é mais gerado no ASP.NET 4. As alterações de renderização afetam os seguintes controles:

* Os controles Image e ImageButton não renderizam mais um atributo border="0".
* A classe BaseValidator e os controles de validação derivados dela não renderizam mais texto vermelho por padrão.
* O controle HtmlForm não renderiza um atributo name.
* O controle Table não renderiza mais um atributo border="0".

Os controles que não foram projetados para a entrada de usuário (por exemplo, o controle Label) não renderizarão mais o atributo disabled="disabled" se sua propriedade Enabled for definida como false (ou se eles herdarem essa configuração de uma caixa de controles).
Se você usar o Visual Studio para atualizar seu aplicativo do ASP.NET 2.0 ou do ASP.NET 3.5, a ferramenta adicionará automaticamente uma configuração ao arquivo Web.config que preservará a renderização herdada. No entanto, ao atualizar um aplicativo alterando o pool de aplicativos no IIS com relação ao .NET Framework 4, o ASP.NET usará o novo modo de renderização por padrão. Para desabilitar o novo modo de renderização, adicione a seguinte configuração ao arquivo Web.config:

<pages controlRenderingCompatibilityVersion="3.5" />
Manipuladores de eventos em documentos padrão O ASP.NET 4 renderiza o valor de atributo form do elemento HTML action como uma cadeia de caracteres vazia quando uma solicitação é feita para uma URL sem extensão que tem um documento padrão mapeado para ela. Em versões anteriores do ASP.NET, uma solicitação para http://contoso.com resultaria em uma solicitação para Default.aspx. Nesse documento, a marca form de abertura seria renderizada como no exemplo a seguir:

<form action="Default.aspx" />

No ASP.NET 4, uma solicitação para http://contoso.com também resulta em uma solicitação para Default.aspx, mas agora o ASP.NET renderiza a marca form de abertura HTML como no exemplo a seguir:

<form action="" />

Quando o atributo action é uma cadeia de caracteres vazia, o objeto DefaultDocumentModule do IIS cria uma solicitação filho para Default.aspx. Na maioria das condições, essa solicitação filho é transparente para o código do aplicativo e a página Default.aspx é executada normalmente. No entanto, uma eventual interação entre código gerenciado e o modo integrado do IIS 7 ou IIS 7.5 pode fazer páginas .aspx gerenciadas pararem de funcionar adequadamente durante a solicitação filho. Se ocorrerem as condições a seguir, a solicitação filho para um documento .aspx padrão resultará em um erro ou em um comportamento inesperado:

* Uma página .aspx é enviada ao navegador com o atributo action do elemento form definido como "".
* O formulário é publicado de volta no ASP.NET.
* Um módulo HTTP gerenciado lê alguma parte do corpo da entidade, como Request.Form ou Request.Params. Isso faz o corpo da entidade da solicitação POST ser lido na memória gerenciada. Como resultado, o corpo da entidade não está mais disponível para quaisquer módulos de código nativo em execução no modo integrado do IIS 7 ou do IIS 7.5.
* Em algum momento, o objeto DefaultDocumentModule do IIS é executado e cria uma solicitação filho para o documento Default.aspx. No entanto, como o corpo da entidade já foi lido por um trecho de código gerenciado, não há nenhum corpo de entidade disponível para enviar a solicitação filho.
* Quando o pipeline HTTP é executado para a solicitação filho, o manipulador dos arquivos .aspx é executado durante a fase de handler-execute.

Como não há nenhum corpo de entidade, há nenhuma variável de formulário e nenhum estado de exibição. Portanto, não há nenhuma informação disponível para o manipulador de página .aspx para determinar qual evento (se houver) deve ser gerado. Como resultado, nenhum manipulador de eventos de postback para a página .aspx afetada é executado.
Para obter informações sobre como solucionar problemas que possam surgir como resultado dessa alteração, consulte “Event Handlers Might Not Be Not Raised in a Default Document in IIS 7 or IIS 7.5 Integrated Mode” (Manipuladores de eventos podem não ser gerados em um documento padrão no modo integrado do IIS 7 ou IIS 7.5) no documento ASP.NET 4 Breaking Changes (Alterações recentes do ASP.NET 4) no site da Web do ASP.NET.
Algoritmo de hash O ASP.NET usa algoritmos de hash e criptografia para ajudar a proteger dados como cookies de autenticação de formulários e estado de exibição. Por padrão, o ASP.NET 4 usa o algoritmo HMACSHA256 para operações de hash em cookies e estado de exibição. As versões anteriores do ASP.NET usavam o algoritmo HMACSHA1 mais antigo. Se você executar aplicativos que combinam o ASP.NET 2.0 e o ASP.NET 4, em que dados como os cookies de autenticação de formulários devem funcionar em versões do .NET Framework, configure um aplicativo Web ASP.NET 4 para usar o algoritmo HMACSHA1 mais antigo adicionando a seguinte configuração no arquivo Web.config:

<machineKey validation="SHA1" />
Hospedando controles no Internet Explorer Não é mais possível hospedar controles do Windows Forms no Internet Explorer, porque há soluções melhores para hospedar controles na Web. Portanto, os assemblies IEHost.dll e IEExec.exe foram removidos do .NET Framework. É possível usar as seguintes tecnologias para o desenvolvimento de controles personalizados em aplicativos Web:

* É possível criar um aplicativo Silverlight e configurá-lo para ser executado fora do navegador. Para obter mais informações, consulte Out-of-Browser Support (Suporte à execução fora do navegador).
*É possível criar um XBAP (aplicativo de navegador XAML) para aproveitar os recursos do WPF (requer o .NET Framework em computadores cliente). Para obter mais informações, consulte Visão geral de aplicativos de navegador XAML WPF.
Métodos HtmlEncode e UrlEncode Os métodos HtmlEncode e UrlEncode das classes HttpUtility e HttpServerUtility foram atualizados para codificar o caractere de aspas simples (') da seguinte maneira:

* O método HtmlEncode codifica instâncias de aspas simples como &#39;
* O método UrlEncode codifica instâncias de aspas simples como %27
Em seu código, procure locais nos quais você usa os métodos HtmlEncode e UrlEncode, e certifique-se de que a alteração na codificação não resulte em uma alteração que possa afetar seu aplicativo.
Erros HttpException em aplicativos ASP.NET 2.0 Depois que o ASP.NET 4 tiver sido habilitado no IIS 6, os aplicativos ASP.NET 2.0 executados no IIS 6 (no Windows Server 2003 ou Windows Server 2003 R2) poderão gerar erros como o seguinte: System.Web.HttpException: Path '/[yourApplicationRoot]/eurl.axd/[Value]' was not found. * Se não for necessário ter o ASP.NET 4 para executar o site da Web, remapeie o site para usar o ASP.NET 2.0.

-ou-

* Se for necessário ter o ASP.NET 4 para executar o site da Web, mova quaisquer diretórios virtuais do ASP.NET 2.0 filho para um site da Web diferente mapeado para o ASP.NET 2.0.

-ou-

* Desabilite URLs sem extensão. Para obter mais informações, consulte "Aplicativos ASP.NET 2.0 podem gerar erros HttpException que referenciam eurl.axd" no documento ASP.NET 4 Breaking Changes (Alterações recentes do ASP.NET 4) no site da Web do ASP.NET.
Tipos de associação Alguns tipos (por exemplo, MembershipProvider) usados na associação do ASP.NET foram movidos do System.Web.dll para o assembly System.Web.ApplicationServices.dll. Os tipos foram movidos para resolver as dependências de camadas de arquitetura entre os tipos no cliente e nos SKUs do .NET Framework estendido. As bibliotecas de classes que foram atualizadas de versões anteriores do ASP.NET e que usarem os tipos de associação movidos poderão falhar ao compilar quando usadas em um projeto do ASP.NET 4. Nesse caso, adicione uma referência no projeto da biblioteca de classes ao System.Web.ApplicationServices.dll.
Alterações no Controle de menu Alterações no controle Menu resultam no seguinte comportamento:

* Se MenuRenderingMode for definido como List ou se MenuRenderingMode for definido como Default e ControlRenderingCompatibilityVersion for definido como 4.0 ou posterior, a propriedade PopOutImageUrl não terá nenhum efeito.
*Se o caminho definido nas propriedades StaticPopOutImageUrl e DynamicPopOutImageUrl contiver uma barra invertida (\), as imagens não serão renderizadas. (Nas versões anteriores do ASP.NET, o caminho podia incluir uma barra invertida.)
* Em vez de configurar a propriedade PopOutImageUrl para itens de menu individuais, defina o StaticPopOutImageUrl ou DynamicPopOutImageUrl do controle pai Menu.

-ou-

Defina MenuRenderingMode como Table ou defina MenuRenderingMode como Default e defina ControlRenderingCompatibilityVersion como 3.5. Essas configurações fazem o controle Menu usar o layout baseado em tabela HTML usado em versões anteriores do ASP.NET.
*Se o caminho na propriedade StaticPopOutImageUrl ou DynamicPopOutImageUrl contiver uma barra invertida (\), substitua por um caractere de barra (/).
Assembly móvel no arquivo Web.config Nas versões anteriores do ASP.NET, uma referência ao assembly System.Web.Mobile.dll foi incluída no arquivo Web.config raiz na seção assemblies em system.web/compilation. Para melhorar o desempenho, a referência a esse assembly foi removida.

Observação: o assembly System.Web.Mobile.dll e os controles móveis do ASP.NET estão incluídos no ASP.NET 4, mas eles são preteridos.
Se você desejar usar tipos desse assembly, adicione uma referência ao assembly no arquivo Web.config raiz ou em um arquivo Web.config do aplicativo.
Cache de saída No ASP.NET 1.0, um bug fazia com que as páginas em cache que especificavam Location="ServerAndClient" como uma configuração de cache de saída emitissem um cabeçalho HTTP Vary:* na resposta. O efeito disso era informar os navegadores de clientes a nunca armazenar a página em cache localmente. No ASP.NET 1.1, o método SetOmitVaryStar foi adicionado, que poderia ser chamado para suprimir o cabeçalho Vary:*. No entanto, os relatórios de bugs sugerem que os desenvolvedores não têm conhecimento do comportamento SetOmitVaryStar existente.

No ASP.NET 4, o cabeçalho HTTP Vary:* não é mais emitido com base em respostas que especificam a seguinte diretiva:

<%@ OutputCache Location="ServerAndClient" %>

Como resultado, o método SetOmitVaryStar não é mais necessário para suprimir o cabeçalho Vary:*. Em aplicativos que especificam "ServerAndClient" para o atributo Location, as páginas poderão ser armazenadas em cache no navegador sem a necessidade de chamar SetOmitVaryStar.
Se as páginas do aplicativo precisarem emitir Vary:*, chame o método AppendHeader conforme mostrado no exemplo a seguir:

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

Ou é possível alterar o valor do atributo Location do cache de saída para "Servidor".
Análise da página O analisador de página para páginas da Web do ASP.NET (arquivos .aspx) e controles de usuário (arquivos .ascx) é mais rígido no ASP.NET 4 do que em versões anteriores do ASP.NET e ele sinaliza mais marcações como inválidas do que em versões anteriores. Examine mensagens de erro produzidas quando uma página é executada e corrigem erros resultantes de marcação inválida.
Tipos de Passport O suporte ao Passport incorporado no ASP.NET 2.0 é obsoleto e não tem mais suporte devido a alterações no Passport (agora SDK do Live ID). Como resultado, agora os tipos relacionados ao Passport no System.Web.Security são marcados com o atributo ObsoleteAttribute. Altere qualquer código que use tipos Passport no namespace System.Web.Security (por exemplo, PassportIdentity) para usar o SDK do Windows Live ID.
Informação PathInfo na propriedade FilePath O ASP.NET 4 não inclui mais o valor PathInfo nos valores de retorno de propriedades como FilePath, AppRelativeCurrentExecutionFilePath e CurrentExecutionFilePath. Em vez disso, as informações PathInfo do estão disponíveis em PathInfo. Por exemplo, imagine o fragmento da URL a seguir:

/testapp/Action.mvc/SomeAction

Em versões anteriores do ASP.NET, as propriedades HttpRequest têm os seguintes valores:

* FilePath: /testapp/Action.mvc/SomeAction
* PathInfo: (vazio)

No ASP.NET 4, as propriedades HttpRequest têm os seguintes valores:

* FilePath: /testapp/Action.mvc
* PathInfo: SomeAction
Em seu código, examine os locais nos quais você depende de propriedades da classe HttpRequest para retornar as informações do caminho; altere o código para refletir as alterações na maneira como as informações do caminho são retornadas.
Validação de solicitação Para melhorar a validação de solicitação, a validação de solicitação do ASP.NET é invocada anteriormente no ciclo de vida da solicitação. Como resultado, a validação de solicitação é executada para solicitações que não são para arquivos .aspx, como para chamadas de serviço Web e para manipuladores personalizados. A validação de solicitação também estará ativa quando os módulos HTTP personalizados estiverem sendo executados no pipeline de processamento da solicitação.

Em decorrência dessa alteração, as solicitações de recursos que não sejam arquivos .aspx talvez gerem erros de validação de solicitação. Código personalizado executado no pipeline de solicitação (por exemplo, módulos HTTP personalizados) talvez gerem também erros de validação de solicitação.
Se necessário, é possível reverter para o antigo comportamento de ter apenas páginas .aspx disparando validação de solicitação por meio da seguinte configuração no arquivo de configuração da Web:

<httpRuntime requestValidationMode="2.0" />

Aviso: ao reverter para o comportamento antigo, verifique se todos os códigos em manipuladores, módulos e outros códigos personalizados existentes executam verificações de entradas HTTP potencialmente inseguras que podem ser vetores de ataque XSS.
Roteamento Se você criar um site da Web do sistema de arquivos no Visual Studio 2010 e ele estiver em uma pasta que contenha um ponto (.) no nome da pasta, o roteamento de URL não funcionará com segurança. Um erro 404 de HTTP é retornado de alguns caminhos virtuais. Isso ocorre porque o Visual Studio 2010 abre o Visual Studio Development Server que usa um caminho incorreto para o diretório virtual raiz. * Na página Propriedades do site da Web baseado em arquivo, altere o atributo Caminho virtual para "/".

-ou-

* Crie um projeto de aplicativo Web em vez de um projeto de site da Web. Os projetos de aplicativo Web não apresentam esse problema e o roteamento de URL funcionará mesmo se a pasta de projeto tiver um ponto no nome.

-ou-

* Crie um site da Web baseado em HTTP hospedado no IIS. Os sites da Web hospedados pelo IIS podem ter pontos do caminho virtual, bem como a pasta do arquivo de projeto.
Sites do SharePoint Se você tentar executar um site da Web ASP.NET 4 implantado como filho de um site da Web do SharePoint que contém um nível de confiança parcial personalizado nomeado WSS_Minimal, você verá o seguinte erro:

Could not find permission set named 'ASP.Net'.
No momento, nenhuma versão do SharePoint é compatível com o ASP.NET. Como resultado, você não deverá tentar executar um site da Web do ASP.NET 4 como um filho de um site da Web do SharePoint.
Padrões XHTML 1.1 A fim de habilitar a conformidade com XHTML 1.1 para novos sites, os controles do ASP.NET no .NET Framework 4 gerarão um HTML compatível com XHTML 1.1. Essa renderização é habilitada usando a seguinte opção no arquivo Web.config dentro do elemento <system.Web>:

<pages controlRenderingCompatibilityVersion="4.0"/>

Essa opção é definida, por padrão, como 4.0. Os projetos da Web atualizados do Visual Studio 2008 têm a configuração 3.5 habilitada para compatibilidade.
Nenhum.

Núcleo

Recursos gerais

Recurso Diferenças de 3.5 SP1 Alterações recomendadas
CardSpace Agora, o Windows CardSpace não está mais incluído no .NET Framework e é fornecido separadamente. Baixe o Windows CardSpace do Centro de Download da Microsoft.
Arquivos de configuração Correções foram feitas na forma como o .NET Framework acessa os arquivos de configuração do aplicativo. Se o arquivo de configuração do aplicativo for application-name.config, altere o nome para application-name.exe.config. Por exemplo, altere o nome MyApp.config para MyApp.exe.config.
Compilador de código C# As classes Compiler, CompilerError e ErrorLevel que estavam no namespace Microsoft.CSharp não estão mais disponíveis e o assembly associado (cscompmgd.dll) não está mais incluído no .NET Framework. Use a classe CodeDomProvider e outras classes no namespace System.CodeDom.Compiler. Para obter mais informações, consulte Usando o CodeDOM.
Hospedagem (API não gerenciada) Para melhorar os recursos de hospedagem, algumas APIs de ativação de hospedagem foram preteridas. Os recursos de execução lado a lado no processo permitem que um aplicativo carregue e inicie diversas versões do .NET Framework no mesmo processo. Por exemplo, é possível executar aplicativos que carregam suplementos (ou componentes) baseados no .NET Framework 2.0 SP1 e suplementos baseados no .NET Framework 4 no mesmo processo. Componentes mais antigos continuam usando a versão mais antiga do .NET Framework e os novos usam a nova versão do .NET Framework. Use as configurações descritas na Execução lado a lado em processo.
Novo modelo de segurança A política de CAS (segurança de acesso do código) foi desativada e substituída por um modelo simplificado, conforme descrito em Alterações de segurança no .NET Framework 4. Talvez sejam necessárias modificações se você depender do CAS em seus aplicativos. Para obter mais informações, consulte Compatibilidade de política de segurança de acesso de código e migração.

Data e Hora

Namespace: System

Assembly: mscorlib (em mscorlib.dll)

Recurso Diferenças de 3.5 SP1 Alterações recomendadas
Horário de verão Para ser consistente com o relógio do sistema, agora as propriedades de tempo (como Local e Now) usam regras do sistema operacional, em vez de outros dados do .NET Framework para operações de horário de verão. Nenhum.
Formatação de cadeia de caracteres Para dar suporte à formatação que faz diferenciação de culturas, a estrutura TimeSpan inclui novas sobrecargas dos métodos ToString, Parse e TryParse além dos novos métodos ParseExact e TryParseExact. Nenhum.

Globalização

Para obter uma lista de novas culturas neutras e específicas, consulte Novidades sobre globalização e localização.

Namespace: System.Globalization

Assembly: mscorlib (em mscorlib.dll)

Recurso Diferenças de 3.5 SP1 Alterações recomendadas
Nomes de cultura As alterações de nome a seguir afetam as culturas alemã, divehi e africana:

* CurrencyEnglishName: o nome da moeda para a cultura alemã (Suíça) (de-CH) mudou de "sFr." para "Fr.".
* LongDatePattern: o padrão de data longo para a cultura divehi (Maldivas) (dv-MV) foi alterado de "dd/MMMM/aaaa" para "dd/MM/aaaa".
* PMDesignator: o designador PM da cultura africâner (África do Sul) (af-ZA) mudou de "nm" para "PM".
Observe as alterações no nome da cultura.
Parâmetro LCID Para ser consistente com o comportamento esperado nas configurações do servidor de automação, o CLR não passa mais a cultura atual para o parâmetro LCID para aplicativos baseados em COM não gerenciados. Em vez disso, ele passa 1033 (en-us) para a cultura. Nenhuma modificação necessária, exceto para aplicativos nativos que exigem uma cultura especificada.
Tipos de cultura obsoletos Agora os tipos de cultura CultureTypes e CultureTypes estão obsoletos.

Para compatibilidade com versões anteriores, agora o CultureTypes retorna culturas neutras e específicos incluídas com a versão anterior do .NET Framework e agora o CultureTypes retorna uma lista vazia.
Use outros valores da enumeração CultureTypes.
Recuperação da cultura A partir do Windows 7, o .NET Framework 4 recupera informações de cultura do sistema operacional em vez de armazenar os dados. Além disso, o .NET Framework é sincronizado com o Windows para classificar e encapsular dados. Nenhum.
Padrões Unicode 5.1 O .NET Framework agora dá suporte a todos os caracteres Unicode 5.1, o que representa uma adição de aproximadamente 1.400 caracteres. Os caracteres adicionais incluem novos símbolos, setas, marcas diacríticas, pontuação, símbolos matemáticos, ideogramas e traços CJK, caracteres numéricos malaiala e télugo adicionais e vários caracteres birmanês, latino, árabe, grego, mongol e cirílico adicionais. Há suporte para os novos scripts a seguir com Unicode 5.1: caracteres sudanês, lepcha, ol chiki, vai, saurashtra, kayah li, rejang, gurmukhi, oriá, tâmil, télugo e malaiala e Cham. Nenhum.

Exceções

Namespaces: System e System.Runtime.ExceptionServices

Assembly: mscorlib (em mscorlib.dll)

Recurso Diferenças de 3.5 SP1 Alterações recomendadas
Exceções do estado de processo corrompido O CLR não oferece mais exceções do estado de processo corrompido a manipuladores de exceção no código gerenciado. Essas exceções indicam que o estado de um processo foi corrompido. Não é recomendável executar o aplicativo nesse estado.

Para saber mais, confira HandleProcessCorruptedStateExceptionsAttribute e a entrada Lidar com exceções de estado corrompido na MSDN Magazine.
Exceções do mecanismo de execução Agora o ExecutionEngineException é obsoleto, porque uma exceção capturável permitirá que um processo instável continue sendo executado. Essa alteração melhora a confiabilidade e a previsibilidade no runtime. Use um InvalidOperationException para indicar a condição.

Reflexão

Namespace: System.Reflection

Assembly: mscorlib (em mscorlib.dll)

Recurso Diferenças de 3.5 SP1 Alterações recomendadas
Algoritmos de hash do assembly A propriedade HashAlgorithm retorna AssemblyHashAlgorithm, pois o runtime não conhece o algoritmo de hash do assembly referenciado quando o assembly não está carregado. (Isso se refere ao uso da propriedade em um assembly referenciado como o retornado pelo método GetReferencedAssemblies.) Nenhum.
Carregamento de assembly Para evitar o carregamento redundante de assemblies e para poupar espaço de endereço virtual, agora o CLR carrega assemblies usando apenas a função MapViewOfFile Win32. Ele também não chama mais a função LoadLibrary.

Essa alteração afeta os aplicativos de diagnóstico das seguintes maneiras:

* Um ProcessModuleCollection não conterá mais módulos de uma biblioteca de classes (arquivo .dll), conforme obtido de uma chamada para Process.GetCurrentProcess().Modules.
* Os aplicativos Win32 que usam a função EnumProcessModules não verão todos módulos gerenciados listados.
Nenhum.
Tipo declarativo Agora a propriedade DeclaringType retorna null corretamente quando o tipo não tem um tipo declarativo. Nenhum.
Representantes Agora um delegado gera um ArgumentNullException em vez de um NullReferenceException quando um valor null é passado para o construtor do delegado. Certifique-se de que qualquer tratamento de exceção capture ArgumentNullException.
Alteração no local do cache de assembly global Para assemblies do .NET Framework 4, o cache de assembly global foi movido do diretório Windows (% WINDIR%) para o subdiretório Microsoft.Net (%WINDIR%\Microsoft.Net). Os assemblies de versões anteriores continuam no diretório mais antigo.

A enumeração ASM_CACHE_FLAGS não gerenciada contém o novo sinalizador ASM_CACHE_ROOT_EX. Esse sinalizador obtém o local do cache para assemblies do .NET Framework 4, que podem ser obtidos pela função GetCachePath.
Nenhum, supondo que os aplicativos não usam caminhos explícitos para assemblies, que não é uma prática recomendada.
Ferramenta de Cache de Assembly Global A Gacutil.exe (Ferramenta do cache de assembly global) não dá mais suporte ao visualizador de plugin shell. Nenhum.

Interoperabilidade

Namespace: System.Runtime.InteropServices

Assembly: mscorlib (em mscorlib.dll)

Recurso Diferenças de 3.5 SP1 Alterações recomendadas
Tamanho do buffer (API não gerenciada) Para economizar memória, a funcionalidade do parâmetro pBufferLengthOffset para o método ICorProfilerInfo2::GetStringLayout foi alterada para corresponder ao parâmetro pStringLengthOffset. Ambos os parâmetros agora apontam para o local de deslocamento do tamanho da cadeia de caracteres. O tamanho do buffer foi removido da representação da classe da cadeia de caracteres. Remova qualquer dependência do tamanho do buffer.
Depuração JIT Para simplificar o registro de depuração JIT (Just-In-Time), agora o depurador do .NET Framework usa apenas a chave do Registro AeDebug, que controla o comportamento de depuração JIT para o código nativo. Essa alteração resulta no seguinte:

* Não é mais possível registrar dois depuradores diferentes para código gerenciado e nativo.
* Não é mais possível iniciar o depurador automaticamente para um processo não interativo, mas é possível notificar o usuário para um processo interativo.
* Você não será mais notificado quando o depurador falhar ao iniciar ou quando não houver depurador registrado que deva ser iniciado.
* Não há mais suporte a políticas de início automático que dependem da interatividade do aplicativo.
Ajuste as operações de depuração conforme necessário.
Invocação de plataforma Para melhorar o desempenho na interoperabilidade com código não gerenciado, agora as convenções de chamada incorretas em uma invocação de plataforma geram falhas. Nas versões anteriores, a camada de marshaling resolvia esses erros na pilha. A depuração dos seus aplicativos no Microsoft Visual Studio alertam você sobre esses erros para que você possa corrigi-los.

Se você tem binários que não podem ser atualizados, é possível incluir o elemento <NetFx40_PInvokeStackResilience> no arquivo de configuração do aplicativo para permitir que os erros de chamada sejam resolvidos na pilha como nas versões anteriores. No entanto, isso pode afetar o desempenho do seu aplicativo.
Interfaces removidas (API não gerenciada) Para evitar que os desenvolvedores se confundam, as interfaces a seguir foram removidas porque elas não forneciam nenhum cenário de tempo de execução útil e o CLR não fornecia nem aceitava nenhuma implementação:

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

Dados

Esta seção descreve problemas de migração para usar conjuntos de dados e clientes SQL, o Entity Framework, LINQ to SQL e os servidores de dados WCF (anteriormente conhecidos como Serviços de Dados ADO.NET).

DataSet and Cliente do SQL

A tabela a seguir descreve melhorias em recursos que anteriormente tinham limitações ou outros problemas.

Namespaces: System.Data, System.Data.Objects.DataClasses, System.Data.SqlClient

Assemblies: System.Data (em System.Data.dll) e System.Data.Entity (em System.Data.Entity.dll)

Recurso Diferenças de 3.5 SP1
Cenários POCO A interface IRelatedEnd tem novos métodos para melhorar seu uso em cenários POCO (Objeto CLR Básico). Esses novos métodos usam um Object em vez de uma entidade IEntityWithRelationships como parâmetro.
Edição de linhas O método IndexOf, conforme implementado pela classe DataView, agora retorna corretamente o valor de uma linha que está sendo editada, em vez de retornar -1.
Eventos Agora o evento PropertyChanged é gerado quando uma linha está em um estado modificado e o método RejectChanges é chamado. Essa alteração facilita a criação de controles de interface do usuário que expõem o conteúdo de um objeto DataSet.
Exceções Agora o método Prepare gera um InvalidOperationException quando uma conexão não está definida ou aberta em vez de um NullReferenceException.
Mapeamento de exibições Agora os erros de mapeamento de visualização da consulta são detectados em tempo de design em vez de gerar um tempo de execução NullReferenceException.

Agora a validação do mapeamento detecta o erro no qual dois conjuntos de associações no CSDL (linguagem de definição de esquema conceitual) são mapeados para a mesma coluna.
Transações Se um aplicativo tentar executar uma instrução em uma conexão após uma transação ter sido concluída (inclusive anulada ou revertida), agora um InvalidOperationException é gerado. As versões anteriores não geravam uma exceção e permitiam que você executasse comandos adicionais mesmo se uma transação fosse abortada.

Entity Framework

A tabela a seguir descreve melhorias em recursos que anteriormente tinham limitações ou outros problemas.

Namespaces: System.Data, System.Data.Objects, System.Data.Objects.DataClasses

Assemblies: System.Data.Entity (em System.Data.Entity.dll)

Recurso Diferenças de 3.5 SP1
Objetos de entidade Agora há uma paridade entre o método Detach e o estado do objeto de entidade quando o método SaveChanges é chamado. Essa consistência aprimorada impede que exceções inesperadas sejam lançadas.
Entity SQL As regras foram aprimoradas para resoluções de identificador no Entity SQL.

O analisador do Entity SQL melhorou a lógica para resolver os identificadores de partes múltiplas.
Anotações estruturais Agora o Entity Framework reconhece anotações estruturais.
Consultas As seguintes melhorias foram feitas em consultas:

* A consulta GroupBy que usa uma chave null em uma coleção vazia não retornará nenhuma linha, independentemente se houver qualquer seleção adicional na consulta.
* Agora o SQL gerado nas consultas do LINQ e do Entity-SQL trata os parâmetros de cadeia de caracteres como valores não Unicode por padrão.

LINQ to SQL

A tabela a seguir descreve melhorias em recursos que anteriormente tinham limitações ou outros problemas.

Namespace: System.Data.Linq

Assembly: System.Data.Linq (em System.Data.Linq.dll)

Recurso Diferenças de 3.5 SP1
Eventos Uma coleção EntitySet<TEntity> agora gera o evento ListChanged para adicionar e remover as operações quando o EntitySet<TEntity> é descarregado, além de gerar o evento quando a coleção é carregada.
Consultas Skip(0) não é mais ignorado em chamadas LINQ to SQL. Como resultado, as consultas que têm esse método podem se comportar de maneira diferente. Por exemplo, em alguns casos, será necessária uma cláusula OrderBy com Skip(0), em seguida, a consulta lançará uma exceção NotSupportedException se a cláusula OrderBy não tiver sido incluída.

WCF Data Services

A tabela a seguir descreve melhorias em recursos que anteriormente tinham limitações ou outros problemas.

Namespaces: System.Data.Services, System.Data.Services.Client, System.Data.Services.Common e System.Data.Services.Providers

Assemblies: System.Data.Services (em System.Data.Services.dll) e System.Data.Services.Client (em System.Data.Services.Client.dll)

Recurso Diferenças de 3.5 SP1
Conteúdo binário em lote Agora o WCF Data Services dá suporte ao conteúdo binário em lote em solicitações e respostas.
Interceptadores de alteração Agora os interceptadores de alteração são executados para uma solicitação de exclusão.

Um interceptador de alteração é um método executado sempre que uma solicitação é recebida pelo servidor para modificar uma entidade no conjunto de entidades. Ele é executado antes que a solicitação de entrada é executada. O interceptador de alteração fornece acesso à entidade que está sendo alterada e à operação que está sendo executada nela.
Exceções Agora as condições a seguir lançam exceções mais úteis em vez de um NullReferenceException:

* Um TimeoutException quando uma chamada para um serviço de dados atinge o tempo limite.
* Um DataServiceRequestException quando uma solicitação incorreta é feita para um serviço de dados.

Em seus aplicativos, você deve alterar o tratamento de exceções para capturar novas exceções.
Cabeçalhos As seguintes melhorias foram feitas em cabeçalhos:

* Agora o WCF Data Services rejeita corretamente um cabeçalho eTag que tem um valor não especificado.
* Agora o WCF Data Services retorna um erro e não executa a solicitação para uma solicitação de exclusão para um link quando um cabeçalho if-* está na solicitação.
* O WCF Data Services agora retorna um erro para o cliente no formato (Atom, JSON) que o cliente especificou no cabeçalho de aceitação.
Leitor JSON O leitor JSON (JavaScript Object Notation) agora retorna corretamente um erro quando lê o caractere de escape de barra invertida ("\") ao processar conteúdos JSON enviados para um serviço de dados do WCF.
Mesclagens As seguintes melhorias foram feitas na enumeração MergeOption:

* A opção de mesclagem MergeOption não modifica mais a entidade no cliente como resultado de qualquer resposta subsequente de um serviço de dados.
* Agora a opção MergeOption é consistente entre o SQL dinâmico e as atualizações baseadas em procedimentos armazenados.
Solicitações O método OnStartProcessingRequest agora é chamado antes que uma solicitação aos serviços de dados seja processada. Isso permite que a solicitação funcione corretamente para os serviços ServiceOperation.
Fluxos O WCF Data Services não fecha mais o fluxo subjacente para operações de leitura e de gravação.
URIs A saída de URIs pelo cliente WCF Data Services foi corrigida.

Windows Communication Foundation (WCF)

A tabela a seguir descreve melhorias em recursos que anteriormente tinham limitações ou outros problemas.

Recurso Diferenças de 3.5 SP1
Arquivos de configuração Para habilitar a herança de comportamentos por meio da hierarquia do arquivo de configuração, agora o WCF dá suporte à mesclagem em arquivos de configuração.

Agora o modelo de herança de configuração foi expandido para permitir que os usuários definam os comportamentos que serão aplicados a todos os serviços em execução no computador.

Talvez você encontre alterações de comportamento se houver comportamentos com o mesmo nome em diferentes níveis da hierarquia.
Hospedagem do serviço Não é mais possível especificar o elemento de configuração <serviceHostingEnvironment> no nível de serviço, adicionando o atributo allowDefinition="MachineToApplication" à definição do elemento.

Especificar o elemento <serviceHostingEnvironment> no nível de serviço é tecnicamente incorreto e causa um comportamento inconsistente.

Windows Presentation Foundation (WPF)

Aplicativos

Namespaces: System.Windows e System.Windows.Controls

Assemblies: PresentationFramework (em PresentationFramework.dll)

Recurso Diferenças de 3.5 SP1 Alterações recomendadas
Tratamento de exceções Para permitir que os erros sejam detectados mais cedo, o WPF lança um TargetInvocationException e define a propriedade InnerException como exceções críticas, como NullReferenceException, OutOfMemoryException, StackOverflowException e SecurityException, em vez de capturar a exceção original. Nenhum.
Recursos vinculados Para facilitar a vinculação, os arquivos de recurso (como imagens) localizados em um local diferente da estrutura de pasta do projeto usam o caminho completo do arquivo de recurso em vez de apenas do nome de arquivo, como a ID do recurso quando o aplicativo é criado. O aplicativo será capaz de localizar os arquivos em tempo de execução. Nenhum.
Aplicativos de confiança parcial Para ver as considerações de segurança, os aplicativos baseados no Windows executados em confiança parcial e que contêm um controle WebBrowser ou um controle Frame que contém o HTML lançará um SecurityException quando o controle for criado.

Os aplicativos de navegador lançarão uma exceção e exibirão uma mensagem se todas as seguintes condições forem atendidas:

* O aplicativo está sendo executado no Firefox.
* O aplicativo está sendo executado em confiança parcial na zona da Internet de sites não confiáveis.
* O aplicativo contém um controle WebBrowser ou um controle Frame que contém o HTML.

Os aplicativos executados em sites confiáveis ou na zona da intranet não serão afetados.
Em seus aplicativos de navegador, é possível facilitar essa alteração seguindo um destes procedimentos:

* Execute o aplicativo de navegador em confiança total.
* Peça para os clientes adicionarem o site do aplicativo à zona de sites confiáveis.
Dicionários de recurso Para melhorar os dicionários de recurso de nível de tema e impedir que eles mudem, agora os recursos congeláveis definidos em um dicionário de recurso e mesclados em um dicionário de nível de tema são sempre marcados como congelados e são imutáveis. Esse é o comportamento esperado para recursos congeláveis. Os aplicativos que modificam um recurso definido em um dicionário mesclado de nível de tema devem clonar o recurso e modificar a cópia clonada. Como alternativa, o recurso poderá ser marcado x:Shared="false" para que o ResourceDictionary crie uma nova cópia toda vez que o recurso for consultado.
Windows 7 Para fazer os aplicativos WPF funcionarem melhor no Windows 7, as seguintes melhorias foram feitas para corrigir o comportamento de uma janela:

* Agora os estados de encaixe e de gesto funcionam conforme esperado com base nas interações do usuário.
* Agora os comandos da barra de tarefas Janelas em cascata, Mostrar janelas empilhadas e Mostrar janelas lado a lado têm o comportamento correto e atualizam as propriedades adequadas.
* Agora as propriedades Top, Left, Width e Height de uma janela minimizada ou maximizada contêm o local de restauração correto da janela, em vez de outros valores, dependendo do monitor.
Nenhum.
Transparência e estilo do Windows Um InvalidOperationException será gerado se você tentar definir WindowStyle como um valor diferente de WindowStyle quando AllowsTransparency for true e WindowState for WindowState. Se for necessário alterar o WindowStyle quando AllowsTransparency for true, será possível chamar a função SetWindowLongPtr Win32.
Visualizador XPS O WPF não inclui o XPSEP (Microsoft XML Paper Specification Essentials Pack). O XPSEP é incluído com o Windows 7 e o Windows Vista.

Em um computador que executa o Windows XP sem o .NET Framework 3.5 SP1 instalado, a impressão usando uma API do WPF diferente daquelas em PrintDialog dependerá do WINSPOOL. Alguns recursos da impressora não serão relatados e algumas configurações da impressora não serão aplicadas durante a impressão.
Se necessário, instale o Microsoft XML Paper Specification Essentials Pack.

Controles

Namespaces: System.Windows, System.Windows.Controls, System.Windows.Data e System.Windows.Input

Assemblies: PresentationFramework (em PresentationFramework.dll), PresentationCore (em PresentationCore.dll) e WindowsBase (em WindowsBase.dll)

Recurso Diferenças de 3.5 SP1 Alterações recomendadas
Caixas de diálogo Para aumentar a confiabilidade, o método ShowDialog é chamado no mesmo thread que criou o controle FileDialog. Certifique-se de criar um controle FileDialog e de chamar o método ShowDialog no mesmo thread.
Janelas flutuantes Para corrigir a lógica de restauração de foco que mantém incorretamente a reativação de uma janela flutuante (fazendo-a ser exibida como uma caixa de diálogo modal), agora a restauração de foco será evitada se o candidato não for um filho da janela. Nenhum.
Itens em coleções Quando um item é movido ou adicionado a uma coleção subjacente, ele será exibido no CollectionView no mesmo local relativo se o CollectionView não for classificado. Isso fornece consistência entre a posição do item na coleção e no CollectionView associado. Use o método ContainerFromItem ou IndexOf para encontrar o local de um item em um CollectionView em vez de depender de um local fixo de um item.
Layouts Para eliminar re-layouts desnecessários, alterar o ShowsNavigationUI não invalida mais o layout nem faz outro layout passar. Se você espera que a alteração de ShowsNavigationUI faça outro layout passar, chame InvalidateVisual depois de definir a propriedade.
Menus Para habilitar o texto ClearType nas pop-ups de menu, foram feitas modificações na classe ControlTemplate e no controle MenuItem e em outros controles. Os aplicativos não devem depender da estrutura visual dos modelos de controle. Apenas partes nomeadas de um ControlTemplate fazem parte do contrato público. Se um aplicativo precisar localizar um determinado objeto em um ControlTemplate, pesquise um tipo específico na árvore visual em vez de depender de um local fixo de um objeto na árvore.
Navegação Se um Frame navegar diretamente para um local, a propriedade IsNavigationInitiator será true após a navegação inicial. Essa alteração impede eventos adicionais de serem gerados durante os cenários de inicialização. Nenhum.
Pop-ups Agora o delegado CustomPopupPlacementCallback pode ser chamado várias vezes durante passagem de um layout em vez de apenas uma vez. Se seu delegado CustomPopupPlacementCallback calcular a posição de um Popup com base na posição anterior, recalcule a posição apenas se os valores dos parâmetros popupSize, targetSize ou offset forem alterados.
Valores de propriedade O método SetCurrentValue agora permite definir uma propriedade com um valor efetivo, embora continue a respeitar qualquer associação, estilo ou gatilho que afete a propriedade. Os autores de controle devem usar SetCurrentValue sempre que o valor da propriedade é alterado como um efeito colateral de alguma outra ação, incluindo a manipulação do usuário.
Caixas de texto Para ver considerações de segurança, os métodos Copy e Cut falham silenciosamente quando são chamados em confiança parcial.

Além disso, a execução programática da propriedade Copy ou Cut em um controle herdado de TextBoxBase será bloqueada em confiança parcial. No entanto, os comandos copiar e recortar iniciados pelo usuário, como clicar em um botão cuja propriedade Command esteja associada a um desses comandos, funcionarão. O copiar e cortar padrão por meio de atalhos do teclado e o menu de contexto ainda funcionarão como antes em confiança parcial.
Associe o comando Copy ou Cut a uma ação iniciada pelo usuário, como clicar em um botão.

Gráficos

Namespaces: System.Windows, System.Windows.Controls, System.Windows.Data, System.Windows.Input e System.Windows.Media.Effects

Assemblies: PresentationFramework (em PresentationFramework.dll), PresentationCore (em PresentationCore.dll) e WindowsBase (em WindowsBase.dll)

Recurso Diferenças de 3.5 SP1 Alterações recomendadas
Efeitos de bitmap Para melhorar o desempenho, a classe BitmapEffect e as classes herdadas da classe BitmapEffect, embora ainda presentes, estão desabilitadas. O efeito será renderizado usando o pipeline de renderização acelerado por hardware, se as seguintes condições forem verdadeiras:

* O aplicativo usa um DropShadowBitmapEffect ou um BlurBitmapEffect que tem uma propriedade de raio definida como menos de 100 DIU.
* A placa de vídeo no computador que executa o aplicativo dá suporte a sombreador de pixel 2.0.

Se essas condições não forem atendidas, um objeto BitmapEffect não terá efeito.

Além disso, o Visual Studio produz um aviso do compilador quando encontra o objeto BitmapEffect ou uma subclasse.

O método PushEffect está marcado como obsoleto.
Interrompa o uso do BitmapEffect herdado e as classes derivadas e, em vez disso, use as novas classes derivadas de Effect: BlurEffect, DropShadowEffect e ShaderEffect.

Também é possível criar seus próprios efeitos herdando da classe ShaderEffect.
Quadros de bitmap Agora os objetos BitmapFrame clonados recebem os eventos DownloadProgress, DownloadCompleted e DownloadFailed. Isso permite que as imagens baixadas da Web e aplicadas ao controle Image por meio de um Style funcionem corretamente.

Você verá uma alteração no comportamento apenas se todas as instruções a seguir forem verdadeiras:

* Você assinar o evento DownloadProgress, DownloadCompleted ou DownloadFailed.
* A fonte do BitmapFrame for da Web.
* O BitmapFrame for clonado enquanto o download ainda estiver em andamento.
Verifique o remetente no manipulador de eventos e execute a ação apenas se o remetente for original BitmapFrame.
Decodificação de imagens Para impedir que um IOException não seja tratado quando as imagens não puderem ser decodificadas, a classe BitmapSource gerará o evento DecodeFailed quando ele não decodificar uma imagem. Remova qualquer tratamento de exceções para IOException e use o evento DecodeFailed para verificar se há falha na decodificação.

Entrada

Namespaces: System.Windows, System.Windows.Controls, System.Windows.Data e System.Windows.Input

Assemblies: PresentationFramework (em PresentationFramework.dll), PresentationCore (em PresentationCore.dll) e WindowsBase (em WindowsBase.dll)

Recurso Diferenças de 3.5 SP1 Alterações recomendadas
Associação de instâncias de comando Para fornecer um mecanismo para associar as instâncias do comando baseado em View-Model para gestos de entrada baseados em View, agora a classe InputBinding é herdada de Freezable em vez de DependencyObject. Agora as seguintes propriedades são propriedades de dependência:

* Command
* CommandParameter
* CommandTarget

Essa alteração resulta no seguinte:

* Agora um objeto InputBinding é congelado quando ele é registrado em vez de permanecer mutável.
* Não é possível acessar os objetos InputBinding de nível de instância de vários threads devido a restrições da classe DependencyObject.
* Não é possível modificar associações de entrada de nível de classe após seu registro devido a restrições da classe Freezable.
* Não é possível especificar associações de entrada em instâncias de comando criadas em um View-Model.
Crie instâncias separadas de uma classe InputBinding em threads separados se as associações precisarem ser mutáveis ou congele-as caso contrário. Não modifique um InputBinding estático de nível de classe depois de ele ser registrado.
Aplicativos de navegador Agora os .XBAP (aplicativos de navegador do WPF) processam eventos-chave como aplicativos do WPF autônomos para que os objetos recebam eventos-chave roteados na ordem correta. Nenhum.
Combinações de teclas inativas O WPF ofusca teclas inativas, que não produzem nenhum caractere visível, mas, em vez disso, indica que a chave deve ser combinada com a próxima chave de letra para produzir um caractere. Os eventos-chave de entrada, como o evento KeyDownEvent, relatam quando uma chave é uma tecla inativa, definindo a propriedade Key como o valor Key. Geralmente esse é o comportamento esperado, porque os aplicativos normalmente não pretendem responder à entrada do teclado que cria um caractere combinado. Os aplicativos que esperam ler as chaves que faziam parte de caracteres combinadas podem obter a chave agora ofuscada usando a propriedade DeadCharProcessedKey.
Gerenciador de foco Quando o método FocusManager.GetFocusedElement(DependencyObject) receber um elemento que tem a propriedade anexada IsFocusScope definida como true, o método retornará um elemento que é o último elemento de foco no teclado dentro do escopo desse foco se e somente se o elemento retornado pertencer ao mesmo objeto PresentationSource que o elemento passado para o método. Nenhum.

Automação da Interface de Usuário

Namespace: System.Windows, System.Windows.Automation.Peers, System.Windows.Automation.Provider, System.Windows.Controls, System.Windows.Data e System.Windows.Input

Assemblies: PresentationFramework (em PresentationFramework.dll), PresentationCore (em PresentationCore.dll), UIAutomationProvider (em UIAutomationProvider.dll) e WindowsBase (em WindowsBase.dll)

Recurso Diferenças de 3.5 SP1 Alterações recomendadas
Hierarquia de classe de exibições As classes TreeViewAutomationPeer e TreeViewItemAutomationPeer são herdadas de ItemsControlAutomationPeer em vez de FrameworkElementAutomationPeer. Se você herdar das classes TreeViewItemAutomationPeer e substituir o método GetChildrenCore, considere retornar um objeto herdado da nova classe TreeViewDataItemAutomationPeer.
Contêineres fora da tela Para corrigir um valor retornado incorreto, agora o método IsOffscreenCore retorna corretamente false para contêineres de itens rolados para fora da exibição. Além disso, o valor do método não é afetado por oclusão por outras janelas ou se o elemento está visível em um monitor específico. Nenhum.
Menus e objetos filho Para habilitar a automação da interface do usuário dos menus que contêm filhos diferentes de objetos MenuItem, agora o método GetChildrenCore retorna o objeto AutomationPeer de um objeto UIElement filho, em vez de um objeto MenuItemAutomationPeer. Nenhum.
Novas interfaces e assembly Para habilitar novos recursos de automação de interface do usuário, as interfaces a seguir foram adicionadas:

* IItemContainerProvider
* ISynchronizedInputProvider
* IVirtualizedItemProvider
Qualquer projeto que cria pares de automação do WPF deve adicionar uma referência explícita a UIAutomationProvider.dll.
Miniaturas O método GetClassNameCore retorna um valor em vez de null. Portanto, controles como GridSplitter herdados da classe Thumb relatarão um nome para a automação da interface do usuário. Nenhum.
Elementos virtualizados Para aprimorar o desempenho, o método GetChildrenCore retorna apenas os objetos filho que realmente estão na árvore visual, em vez de todos os objetos filho, independentemente se eles são virtualizados. Use ItemContainerPattern para iterar em todos os itens de um ItemsControlAutomationPeer.

XAML

Namespaces: System.Windows, System.Windows.Controls, System.Windows.Data, System.Windows.Input e System.Windows.Markup

Assemblies: PresentationFramework (em PresentationFramework.dll), PresentationCore (em PresentationCore.dll) e WindowsBase (em WindowsBase.dll)

Recurso Diferenças de 3.5 SP1 Alterações recomendadas
Extensão de marcação Agora o WPF sempre usa corretamente o valor do método ProvideValue em vez de retornar o objeto MarkupExtension em determinados casos quando uma extensão de marcação é usada para definir uma propriedade ou para criar um item em uma coleção. Uma extensão de marcação pode retornar a si mesma em alguns casos. Se seu aplicativo acessar um recurso que retornou um objeto MarkupExtension em versões anteriores, referencie o objeto retornado de ProvideValue, em vez do objeto MarkupExtension.
Análise de atributos Agora os atributos em XAML podem ter apenas um ponto. Por exemplo, é válido o seguinte:

<Button Background="Red"/> (nenhum ponto)

<Button Button.Background = "Red"/> (um ponto)

O exemplo a seguir não é mais válido:

<Button Control.Button.Background = "Red"/> (mais de um ponto)
Atributos XAML corretos que têm mais de um período.

XML

As linhas desta tabela descrevem aprimoramentos em recursos que anteriormente tinham limitações ou outros problemas.

Esquema e transformações

Namespaces: System.Xml.Linq; System.Xml.Schema e System.Xml.XPath

Assemblies: System.Xml (em System.Xml.dll) e System.Xml.Linq (em System.Xml.Linq.dll)

Recurso Diferenças de 3.5 SP1
Esquemas Chameleon Para evitar dados corrompidos, agora os esquemas Chameleon são clonados corretamente quando são incluídos com vários esquemas.

Os esquemas Chameleon são esquemas que não têm um namespace de destino e quando eles são incluídos em outro XSD, eles assumem o namespace de destino do esquema de importação. Geralmente, eles são usados para incluir tipos comuns em um esquema.
Funções de ID Agora a função de ID XSLT retorna o valor correto, em vez de null quando um objeto XmlReader é passado para um XSLT.

Se o usuário criou um objeto XmlReader de uma classe LINQ to XML usando o método CreateReader e esse objeto XmlReader foi passado para um XSLT, quaisquer instâncias da função id no XSLT anteriormente retornavam null. Esse não é um valor retornado permitido para a função id.
Atributo do namespace Para evitar dados corrompidos, agora um objeto XPathNavigator retorna o nome local do atributo x:xmlns corretamente.
Declarações de namespace Um objeto XmlReader em uma subárvore não cria mais declarações de namespace duplicadas em um elemento XML.
Validação de esquema Para impedir uma validação do esquema incorreta, a classe XmlSchemaSet permite que esquemas XSD sejam compilados de maneira correta e consistente. Esses esquemas podem incluir outros esquemas; por exemplo, A.xsd pode incluir B.xsd, que pode incluir C.xsd. A compilação de qualquer um desses exemplos faz o grafo de dependências ser atravessado.
Funções de script A função function-available não retorna mais false incorretamente quando a função está realmente disponível.
URIs Agora o método Load retorna o BaseURI correto em consultas LINQ.

Validação

Namespaces: System.Xml.Linq, System.Xml.Schema e System.Xml.XPath

Assemblies: System.Xml (em System.Xml.dll) e System.Xml.Linq (em System.Xml.Linq.dll)

Recurso Diferenças de 3.5 SP1
Resolvedores de namespace O método ReadContentAs não ignora mais o resolvedor IXmlNamespaceResolver passado para ele.

Nas versões anteriores, o resolvedor de namespace especificado foi ignorado e o XmlReader foi usado.
Espaço em branco Para evitar a perda de dados quando você estiver criando um leitor, o método Create não descarta mais espaços em branco significativos.

A validação de XML reconhece o modo de conteúdo misto, no qual o texto pode ser mesclado com a marcação XML. No modo misto, qualquer espaço em branco é significativo e deve ser relatado.

Gravando

Namespaces: System.Xml.Linq, System.Xml.Schema e System.Xml.XPath

Assemblies: System.Xml (em System.Xml.dll) e System.Xml.Linq (em System.Xml.Linq.dll)

Recurso Diferenças de 3.5 SP1
Referências de entidade Para evitar dados corrompidos, as referências de entidade não são mais criadas duas vezes em atributos XML.

Se o usuário tentou gravar uma entidade em um atributo xmlns ou em um atributo xml:lang ou xml:space usando o método WriteEntityRef, a entidade foi criada duas vezes na saída, corrompendo, portanto, os dados.
Tratamento de nova linha Para evitar dados corrompidos, os objetos XmlWriter respeitam a opção NewLineHandling.

Confira também