Compartilhar via


Problemas de migração do .NET Framework 4

Este artigo descreve 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 do cliente. A maioria dessas alterações não exige modificações de programação em seus aplicativos. Para aqueles que podem envolver modificações, consulte a coluna de 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 de nível superior dos problemas neste artigo, consulte o Guia de Migração para o .NET Framework 4.

Para obter informações sobre novos recursos, consulte As 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)

Característica 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 navegadores e dispositivos novos e atualizados. Navegadores e dispositivos mais antigos, como o Netscape Navigator, foram removidos e navegadores e dispositivos mais recentes, como Google Chrome e Apple iPhone, foram adicionados.

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

O objeto HttpBrowserCapabilities (que é exposto pela propriedade Request.Browse da página) é controlado pelos arquivos de definição do navegador. Portanto, as informações retornadas acessando uma propriedade desse objeto no ASP.NET 4 podem ser diferentes das informações retornadas em uma versão anterior do ASP.NET.
Se o aplicativo depender dos arquivos de definição do navegador antigos, você poderá copiá-los da seguinte pasta:

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

Copie os arquivos para a pasta \CONFIG\Browsers correspondente para ASP.NET 4. Depois de copiar os arquivos, execute a ferramenta de linha de comando Aspnet_regbrowsers.exe . Para obter mais informações, consulte o https://www.asp.net/mobile site.
Aplicativos filho em execução em versões mistas do ASP.NET ASP.NET 4 aplicativos configurados como filhos de aplicativos que executam versões anteriores do ASP.NET podem falhar ao iniciar devido a erros de configuração ou compilação. O erro específico que ocorre depende se o aplicativo é executado no IIS 6.0 ou no IIS 7 ou IIS 7.5. Você pode 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 de ClientID A nova clientIDMode configuração no ASP.NET 4 permite especificar como ASP.NET gera o id atributo para elementos HTML. Nas versões anteriores do ASP.NET, o comportamento padrão era equivalente à configuração AutoID de clientIDMode. A configuração padrão agora é Predictable. Para obter mais informações, consulte ASP.NET Identificação de Controle do Servidor Web. Se você usar o Visual Studio para atualizar seu aplicativo do ASP.NET 2.0 ou ASP.NET 3.5, a ferramenta adicionará automaticamente uma configuração ao arquivo Web.config que preserva o comportamento de versões anteriores do .NET Framework. No entanto, se você atualizar um aplicativo alterando o pool de aplicativos no IIS para o .NET Framework 4 de destino, ASP.NET usará o novo modo por padrão. Para desabilitar o novo modo de ID do cliente, adicione a seguinte configuração ao arquivo Web.config:

<pages clientIDMode="AutoID" />
CAS (segurança de acesso ao código) Recursos do ASP.NET 2.0 que foram adicionados no ASP.NET 3.5 usam o modelo CAS (segurança de acesso de código) do .NET Framework 1.1 e do .NET Framework 2.0. No entanto, a implementação do 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 modificações extensivas na política de CAS do sistema também podem falhar e gerar exceções de segurança. Você pode reverter aplicações ASP.NET 4 em confiança parcial para o comportamento do ASP.NET 1.1 e 2.0 utilizando o novo atributo legacyCasModel no elemento de configuração trust, conforme mostrado no exemplo a seguir:

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

Importante: reverter para o modelo cas mais antigo pode representar segurança reduzida.

Para obter mais informações sobre o novo modelo de segurança de acesso de código ASP.NET 4, consulte Segurança de Acesso ao Código em aplicativos ASP.NET 4.
Arquivos de configuração Os arquivos de configuração raiz (o arquivo machine.config e o arquivo raiz Web.config) para .NET Framework e ASP.NET 4 foram atualizados para incluir a maior parte das informações padrão de configuração encontradas nos arquivos de aplicação Web.config no ASP.NET 3.5. Devido à complexidade dos sistemas de configuração gerenciados do IIS 7 e IIS 7.5, executar aplicativos ASP.NET 3.5 em ASP.NET 4 e no IIS 7 e IIS 7.5 pode causar erros no ASP.NET ou no IIS. Atualize ASP.NET aplicativos 3.5 para ASP.NET 4 usando as ferramentas de atualização do 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 para ASP.NET 4.

No entanto, você pode executar ASP.NET aplicativos 3.5 usando o .NET Framework 4 sem recompilação. Nesse caso, talvez seja necessário modificar manualmente o arquivo de Web.config do aplicativo antes de executar o aplicativo no .NET Framework 4 e no IIS 7 ou IIS 7.5. A alteração específica que você deve fazer depende da combinação de software com o qual você está trabalhando, incluindo versões do Service Pack (SP). Para obter informações sobre as possíveis combinações de software 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 Alterações interruptivas no site ASP.NET.
Controle de renderização Nas versões anteriores do ASP.NET, alguns controles emitiram marcação que você não pôde desabilitar. 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".
* Os BaseValidator controles de classe e validação que derivam dela não renderizam mais o texto vermelho por padrão.
* O HtmlForm controle não renderiza um name atributo.
* O Table controle não renderiza mais um border="0" atributo.

Os controles que não foram projetados para entrada do usuário (por exemplo, o controle Label) não renderizarão mais o atributo disabled="disabled" se sua propriedade Enabled estiver definida como false (ou se herdarem essa configuração de um controle de contêiner).
Se você usar o Visual Studio para atualizar seu aplicativo do ASP.NET 2.0 ou ASP.NET 3.5, a ferramenta adicionará automaticamente uma configuração ao arquivo Web.config que preserva a renderização herdada. No entanto, se você atualizar um aplicativo alterando o pool de aplicativos no IIS para o .NET Framework 4 de destino, 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 ASP.NET 4 renderiza o valor do atributo do form elemento HTML action como uma cadeia de caracteres vazia quando uma solicitação é feita a uma URL sem extensão que tem um documento padrão mapeado para ele. Em versões anteriores do ASP.NET, uma solicitação para http://contoso.com resultava em uma solicitação para o Default.aspx. Nesse documento, a marca de abertura form 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 ASP.NET agora renderiza a tag de abertura form HTML como no exemplo a seguir:

<form action="" />

Quando o action atributo é uma cadeia de caracteres vazia, o objeto IIS DefaultDocumentModule 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 possível interação entre o código gerenciado e o modo integrado do IIS 7 ou IIS 7.5 pode resultar em páginas .aspx gerenciadas pararem de funcionar corretamente durante uma requisição filha. Se ocorrerem as seguintes condições, a solicitação secundária para um documento .aspx padrão resultará em erro ou comportamento inesperado.

* Uma página .aspx é enviada ao navegador com o atributo do elemento formaction definido como "".
* O formulário é postado de volta para 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 nenhum módulo de código nativo que esteja em execução no modo integrado IIS 7 ou IIS 7.5.
* O objeto IIS DefaultDocumentModule acaba sendo executado e cria uma requisição filha 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, não há variáveis de formulário e nenhum estado de exibição. Portanto, não há informações disponíveis para o manipulador de página .aspx para determinar qual evento (se houver) deve ser gerado. Como resultado, nenhum dos manipuladores de eventos de postback é executado na página .aspx afetada.
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 ASP.NET usa algoritmos de criptografia e hash para ajudar a proteger dados, como cookies de autenticação de formulários e exibir o estado. Por padrão, ASP.NET 4 usa o HMACSHA256 algoritmo para operações de hash em cookies e estado de exibição. Versões anteriores do ASP.NET usavam o algoritmo mais antigo HMACSHA1 . Se você executar aplicativos que combinam ASP.NET 2.0 e ASP.NET 4, em que dados como 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 mais antigo HMACSHA1 adicionando a seguinte configuração no arquivo Web.config:

<machineKey validation="SHA1" />
Controles de hosteamento no Internet Explorer Você não pode mais hospedar controles do Windows Forms no Internet Explorer, pois há soluções melhores para hospedar controles na Web. Portanto, os assemblies IEHost.dll e IEExec.exe foram removidos do .NET Framework. Você pode usar as seguintes tecnologias para o desenvolvimento de controle personalizado em aplicativos Web:

* Você pode criar um aplicativo Silverlight e configurá-lo para ser executado fora do navegador. Para obter mais informações, consulte o suporte fora do navegador.
* Você pode 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 dos Aplicativos WPF XAML para Navegador.
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 HtmlEncode método codifica instâncias da aspa única como &#39;
* O UrlEncode método codifica instâncias da aspa única como %27
Examine seu código para locais onde você utiliza os métodos HtmlEncode e UrlEncode, e certifique-se de que a alteração na codificação não resulta em uma mudança que afete sua aplicação.
Erros de HttpException em aplicativos ASP.NET 2.0 Depois que ASP.NET 4 tiver sido habilitado no IIS 6, ASP.NET aplicativos 2.0 executados no IIS 6 (no Windows Server 2003 ou no Windows Server 2003 R2) podem gerar erros como o seguinte: System.Web.HttpException: Path '/[yourApplicationRoot]/eurl.axd/[Value]' was not found. * Se ASP.NET 4 não for necessário para executar o site, remapee o site para usar ASP.NET 2.0.

- ou -

* Caso seja necessário o ASP.NET 4 para executar o site, mova todos os diretórios virtuais filhos do ASP.NET 2.0 para um site diferente que esteja 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 fazem referência a eurl.axd" no documento ASP.NET 4 Mudanças Significativas no site da 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 arquitetônicas entre tipos no cliente e em SKUs estendidas do .NET Framework. Bibliotecas de classes que foram atualizadas de versões anteriores do ASP.NET e que usam tipos de associação que foram movidos podem não ser compiladas quando usadas em um projeto ASP.NET 4. Nesse caso, adicione uma referência no projeto da biblioteca de classes para System.Web.ApplicationServices.dll.
Alterações no controle de menu As alterações no Menu controle resultam no seguinte comportamento:

* Se MenuRenderingMode estiver definido como List, ou se MenuRenderingMode estiver definido como Default e ControlRenderingCompatibilityVersion estiver definido como 4.0 ou posterior, a propriedade PopOutImageUrl não terá 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 definir a PopOutImageUrl propriedade para itens de menu individuais, defina o StaticPopOutImageUrl ou DynamicPopOutImageUrl do controle pai Menu.

- ou -

Definir MenuRenderingMode como Table, ou definir MenuRenderingMode como Default e definir ControlRenderingCompatibilityVersion como 3.5. Essas configurações fazem com que o Menu controle use 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ê quiser usar tipos desse assembly, adicione uma referência ao assembly no arquivo raiz Web.config ou no arquivo de aplicativo Web.config.
Cache de saída No ASP.NET 1.0, um bug fazia com que páginas em cache que especificavam Location="ServerAndClient" como uma configuração de cache de saída emitirem um cabeçalho HTTP Vary:* na resposta. Isso teve o efeito de dizer aos navegadores cliente para nunca armazenarem a página em cache localmente. No ASP.NET 1.1, o método SetOmitVaryStar foi adicionado para ser chamado e suprimir o cabeçalho Vary:*. No entanto, relatórios de bugs sugerem que os desenvolvedores não estão cientes do comportamento existente SetOmitVaryStar .

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

<%@ OutputCache Location="ServerAndClient" %>

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

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

Como alternativa, você pode alterar o valor do atributo de cache de saída Location para "Servidor".
Análise de páginas O analisador de páginas para ASP.NET páginas da Web (arquivos .aspx) e controles de usuário (arquivos.ascx) é mais estrito em ASP.NET 4 do que em versões anteriores do ASP.NET e sinaliza mais marcação como inválida do que em versões anteriores. Examine as mensagens de erro produzidas quando uma página é executada e corrija erros resultantes de marcação inválida.
Tipos de passaporte O suporte do Passport integrado ao ASP.NET 2.0 é obsoleto e não tem suporte devido a alterações no Passport (agora SDK da ID Dinâmica). Como resultado, os tipos relacionados ao Passport em System.Web.Security agora estão marcados com o atributo ObsoleteAttribute. Altere qualquer código que utilize tipos do Passport no namespace System.Web.Security (por exemplo, PassportIdentity) para utilizar o SDK do Windows Live ID.
Informações de PathInfo na propriedade FilePath ASP.NET 4 não inclui mais o PathInfo valor nos valores retornados de propriedades como FilePath, AppRelativeCurrentExecutionFilePathe CurrentExecutionFilePath. Em vez disso, as PathInfo informações estão disponíveis em PathInfo. Por exemplo, imagine o seguinte fragmento de URL:

/testapp/Action.mvc/SomeAction

Nas versões anteriores do ASP.NET, HttpRequest as propriedades 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
Examine seu código para locais em que você depende das propriedades da HttpRequest classe para retornar informações de caminho; altere o código para refletir as alterações na forma como as informações de caminho são retornadas.
Validação de solicitação Para melhorar a validação da solicitação, a validação da solicitação 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 em execução no pipeline de processamento de solicitação.

Como resultado dessa alteração, solicitações de recursos diferentes de arquivos .aspx podem gerar erros de validação de solicitação. O código personalizado executado no pipeline de solicitação (por exemplo, módulos HTTP personalizados) também pode gerar erros de validação de solicitação.
Se necessário, você pode reverter para o comportamento antigo de ter apenas .aspx páginas disparando a validação de solicitação usando a seguinte configuração no arquivo de configuração da Web:

<httpRuntime requestValidationMode="2.0" />

Aviso: se você reverter para o comportamento antigo, verifique se todo o código em manipuladores, módulos e outros códigos personalizados existentes executa verificações de entradas HTTP potencialmente inseguras que podem ser vetores de ataque XSS.
Roteamento Se você criar um site do sistema de arquivos no Visual Studio 2010 e o site estiver em uma pasta que contenha um ponto (.) no nome da pasta, o roteamento de URL não funcionará de forma confiável. Um erro HTTP 404 é retornado de alguns caminhos virtuais. Isso ocorre porque o Visual Studio 2010 inicia o Servidor de Desenvolvimento do Visual Studio usando um caminho incorreto para o diretório virtual raiz. * Na página Propriedades do site baseado em arquivo, altere o atributo Caminho Virtual para "/".

- ou -

* Crie um projeto de aplicativo Web em vez de um projeto de site. Os projetos de aplicativo Web não têm esse problema e o roteamento de URL funciona mesmo que a pasta do projeto tenha um ponto em seu nome.

- ou -

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

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

<pages controlRenderingCompatibilityVersion="4.0"/>

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

Núcleo

Recursos gerais

Característica Diferenças de 3.5 SP1 Alterações recomendadas
CardSpace O Windows CardSpace não está mais incluído no .NET Framework; ele é fornecido separadamente. Baixe o Windows CardSpace no Centro de Download da Microsoft.
Arquivos de configuração Foram feitas correções na forma como o .NET Framework acessa os arquivos de configuração do aplicativo. Se o arquivo de configuração do aplicativo for nomeado application-name.config, renomeie-o para application-name.exe.config. Por exemplo, renomeie 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 seu assembly (cscompmgd.dll) não está mais incluído no .NET Framework. Use a CodeDomProvider classe e outras classes no System.CodeDom.Compiler namespace. Para obter mais informações, consulte Usando o CodeDOM.
Hospedagem (API não gerenciada) Para melhorar os recursos de hospedagem, algumas das APIs de ativação de hospedagem foram preteridas. Os recursos de execução lado a lado em processo permitem que um aplicativo carregue e inicie várias versões do .NET Framework no mesmo processo. Por exemplo, você pode executar aplicativos que carregam suplementos (ou componentes) baseados no .NET Framework 2.0 SP1 e suplementos baseados no .NET Framework 4 no mesmo processo. Os componentes mais antigos continuam a usar a versão mais antiga do .NET Framework e os novos componentes 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 de código) foi desativada e substituída por um modelo simplificado, conforme descrito em Alterações de Segurança no .NET Framework 4. As modificações poderão ser necessárias se você depender do CAS em seus aplicativos. Para obter mais informações, consulte Compatibilidade e migração da Política de Segurança de Acesso ao Código.

Data e hora

Namespace: System

Assembly: mscorlib (em mscorlib.dll)

Característica Diferenças de 3.5 SP1 Alterações recomendadas
Horário de verão Para ser consistente com o relógio do sistema, as propriedades de tempo (como Local e Now) agora 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 cadeias de caracteres Para dar suporte à formatação sensível à cultura, a estrutura TimeSpan inclui novas sobrecargas dos métodos ToString, Parse e TryParse, além de novos métodos ParseExact e TryParseExact. Nenhum.

Globalização

Para obter uma lista de novas culturas neutras e específicas, confira As novidades na globalização e na localização.

Namespace: System.Globalization

Assembly: mscorlib (em mscorlib.dll)

Característica Diferenças de 3.5 SP1 Alterações recomendadas
Identificadores de cultura As seguintes alterações de nome 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 longa para a cultura Divehi (Maldivas) (dv-MV) foi alterado de "dd/MMMM/yyyy" para "dd/MM/yyyy".
* PMDesignator: o designador P.M. da cultura Afrikaans (Á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 Os tipos de cultura CultureTypes e CultureTypes agora estão obsoletos.

Para compatibilidade com versões anteriores, CultureTypes agora retorna culturas neutras e específicas que foram incluídas no .NET Framework anterior e CultureTypes agora retorna uma lista vazia.
Use outros valores da CultureTypes enumeração.
Recuperando a cultura A partir do Windows 7, o .NET Framework 4 recupera informações de cultura do sistema operacional em vez de armazenar os dados em si. Além disso, o .NET Framework sincroniza com o Windows para classificar e inserir dados. Nenhum.
Padrões Unicode 5.1 O .NET Framework agora dá suporte a todos os caracteres Unicode 5.1 , uma adição de aproximadamente 1400 caracteres. Os caracteres adicionais incluem novos símbolos, setas, diacríticos, pontuação, símbolos matemáticos, traços CJK e ideogramas, caracteres numéricos adicionais em malaiala e telugu, além de caracteres de Myanmar, latim, árabe, grego, mongol e cirílico. Os seguintes novos scripts têm suporte com Unicode 5.1: caracteres Sundanese, Lepcha, Ol Chiki, Vai, Saurashtra, Kayah Li, Rejang, Gurmukhi, Odia, Tamil, Telugu, Malayalam e caracteres Cham. Nenhum.

Exceções

Namespaces: System e System.Runtime.ExceptionServices

Assembly: mscorlib (em mscorlib.dll)

Característica Diferenças de 3.5 SP1 Alterações recomendadas
Exceções para o estado do processo corrompido O CLR não fornece mais exceções para o estado do processo corrompido para manipuladores de exceção no código gerenciado. Essas exceções indicam que o estado de um processo foi corrompido. Não recomendamos que você execute seu 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 ExecutionEngineException agora está obsoleto, pois uma exceção que pode ser capturada permitirá que um processo instável continue a ser executado. Essa alteração melhora a previsibilidade e a confiabilidade no runtime. Use um InvalidOperationException para sinalizar a condição.

Reflexão

Namespace: System.Reflection

Assembly: mscorlib (em mscorlib.dll)

Característica 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 economizar espaço de endereço virtual, o CLR agora carrega assemblies usando apenas a função Win32 MapViewOfFile . Ele também não chama mais a função LoadLibrary.

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

* A ProcessModuleCollection não incluirá mais nenhum módulo de uma biblioteca de classes (arquivo.dll), como obtido por meio de uma chamada para Process.GetCurrentProcess().Modules.
* Os aplicativos Win32 que usam a EnumProcessModules função não verão todos os módulos gerenciados listados.
Nenhum.
Tipo de declaração A propriedade DeclaringType agora retorna corretamente 'nulo' quando o tipo não tem um tipo de declaração. Nenhum.
Representantes Um delegado agora gera um ArgumentNullException em vez de um NullReferenceException ao passar um valor nulo para o seu construtor. 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 do 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 ASM_CACHE_ROOT_EX sinalizador. Esse sinalizador obtém o local de 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)

Característica Diferenças de 3.5 SP1 Alterações recomendadas
Comprimento do buffer (API não gerenciada) Para salvar memória, a funcionalidade do pBufferLengthOffset parâmetro para o método ICorProfilerInfo2::GetStringLayout foi alterada para corresponder ao pStringLengthOffset parâmetro. Ambos os parâmetros agora apontam para o local de deslocamento do tamanho da cadeia de caracteres. O comprimento do buffer foi removido da representação da classe de cadeia de caracteres. Remova qualquer dependência no comprimento 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:

* Você não pode mais registrar dois depuradores diferentes para código gerenciado e nativo.
* Você não pode mais iniciar o depurador automaticamente para um processo não interativo, mas pode solicitar ao usuário um processo interativo.
* Você não é mais notificado quando o depurador falha ao iniciar ou quando não há nenhum depurador registrado que deve ser iniciado.
* Não há mais suporte para políticas de inicialização automática 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, convenções de chamada incorretas em uma invocação de plataforma agora fazem com que o aplicativo falhe. 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 aplicativo.
Interfaces removidas (API não gerenciada) Para evitar confusão do desenvolvedor, as seguintes interfaces foram removidas, pois não forneceram cenários úteis de tempo de execução e o CLR não forneceu nem aceitou nenhuma implementação:

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

Dados

Esta seção descreve problemas de migração para o uso de conjuntos de dados e clientes SQL, Entity Framework, LINQ to SQL e WCF Data Servers (anteriormente conhecidos como ADO.NET Data Services).

DataSet e SQL Client

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

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

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

Característica 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 tomam uma Object entidade em vez de uma IEntityWithRelationships entidade como um parâmetro.
Editando linhas O IndexOf método, conforme implementado pela DataView classe, agora retorna corretamente o valor de uma linha que está sendo editada, em vez de retornar -1.
Eventos O evento PropertyChanged agora é acionado quando uma linha está no 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 DataSet objeto.
Exceções O Prepare método agora lança um InvalidOperationException quando uma conexão não está definida ou aberta em vez de uma NullReferenceException.
Visualizações de mapeamento 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.

A validação de mapeamento agora captura o erro no qual dois conjuntos de associação no Esquema Conceitual (CSDL) 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 geraram uma exceção e permitem executar comandos adicionais mesmo que uma transação tenha sido anulada.

Estrutura de Entidade

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

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

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

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

O Analisador SQL de Entidade melhorou a lógica para resolver identificadores multipartes.
Anotações estruturais O Entity Framework agora reconhece anotações estruturais.
Consultas As seguintes melhorias foram feitas em consultas:

* Uma GroupBy consulta usando uma chave nula em uma coleção vazia não retornará nenhuma linha, independentemente se houver outras seleções na consulta.
* O SQL gerado em consultas LINQ e Entity-SQL agora 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 nos recursos que anteriormente tinham limitações ou outros problemas.

Namespace: System.Data.Linq

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

Característica 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 nas consultas LINQ to SQL. Como resultado, as consultas que têm esse método podem se comportar de forma 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.

Serviços de Dados do WCF

A tabela a seguir descreve melhorias nos 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)

Característica Diferenças de 3.5 SP1
Conteúdo binário agrupado Os Serviços de Dados do WCF agora dão suporte a conteúdo binário em lote em solicitações e respostas.
Alterar interceptadores Agora os interceptadores de alteração são executados para uma solicitação de exclusão.

Um interceptador de alterações é um método que é 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 seja executada. O interceptador de alterações fornece acesso à entidade que está sendo alterada e à operação que está sendo executada nela.
Exceções As seguintes condições agora geram 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 as novas exceções.
cabeçalhos As seguintes melhorias foram feitas em cabeçalhos:

* Os Serviços de Dados do WCF agora rejeitam corretamente um eTag cabeçalho que tem um valor não especificado.
* Os Serviços de Dados do WCF agora retornam um erro e não executam a solicitação de uma solicitação de exclusão para um link quando um if-* cabeçalho está na solicitação.
* Os Serviços de Dados do WCF agora retornam um erro ao cliente no formato (Atom, JSON) especificado pelo cliente no cabeçalho Accept.
Leitor JSON O leitor JSON (JavaScript Object Notation) agora retorna corretamente um erro quando lê o caractere de escape de barra invertida única ("\") quando processa cargas JSON enviadas a um Serviço de Dados WCF.
Mesclagens As seguintes melhorias foram feitas na MergeOption enumeração:

* 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.
* A opção MergeOption agora é consistente entre atualizações de SQL dinâmico e as baseadas em procedimentos armazenados.
Solicitações O OnStartProcessingRequest método agora é chamado antes que uma solicitação aos serviços de dados seja processada. Isso permite que a solicitação funcione corretamente para ServiceOperation serviços.
Fluxos Os Serviços de Dados do WCF não fecham mais o fluxo subjacente para operações de leitura e 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 nos recursos que anteriormente tinham limitações ou outros problemas.

Característica Diferenças de 3.5 SP1
Arquivos de configuração Para habilitar a herança de comportamentos por meio da hierarquia de arquivos de configuração, o WCF agora dá suporte à mesclagem entre arquivos de configuração.

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

Você poderá encontrar alterações comportamentais se houver comportamentos com o mesmo nome em diferentes níveis da hierarquia.
Hospedagem de serviço Você não pode mais especificar o <serviceHostingEnvironment> elemento de configuração no nível do serviço adicionando o atributo allowDefinition="MachineToApplication" à definição do elemento.

Especificar o <serviceHostingEnvironment> elemento 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)

Característica Diferenças de 3.5 SP1 Alterações recomendadas
Manuseio de exceção Para permitir que erros sejam detectados anteriormente, o WPF lança um TargetInvocationException e define a propriedade InnerException para 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) que estão localizados em um local diferente da estrutura de pastas do projeto usam o caminho completo do arquivo de recurso em vez de apenas seu nome de arquivo como a ID do recurso quando o aplicativo é criado. O aplicativo poderá localizar os arquivos em tempo de execução. Nenhum.
Aplicativos de confiança parcial Para considerações de segurança, aplicativos baseados no Windows que são executados em confiança parcial e contêm um WebBrowser controle ou um Frame controle que contém HTML gerarão um SecurityException quando o controle for criado.

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

* O aplicativo está em execução 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 WebBrowser controle ou um Frame controle que contém HTML.

Os aplicativos executados em sites confiáveis ou na zona da intranet não serão afetados.
Em seus aplicativos de navegador, você pode facilitar essa alteração fazendo um dos seguintes procedimentos:

* Execute o aplicativo do navegador com total confiança.
* Fazer com que os clientes adicionem o site do aplicativo à zona de sites confiáveis.
Dicionários de recursos Para melhorar os dicionários de recursos no nível de tema e impedi-los de serem alterados, os recursos congeláveis que são definidos em um dicionário de recursos e mesclados em um dicionário de nível de tema agora estã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 no nível do tema devem clonar o recurso e modificar a cópia clonada. Como alternativa, o recurso pode ser marcado x:Shared="false" para que ele ResourceDictionary crie uma nova cópia sempre que o recurso for consultado.
Windows 7 Para fazer com que os aplicativos WPF funcionem melhor no Windows 7, foram feitas as seguintes melhorias 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.
* Os comandos da barra de tarefas Janelas em cascata, Mostrar janelas empilhadas e Mostrar janelas lado a lado agora têm o comportamento correto e atualizam as propriedades apropriadas.
* As propriedades Top, Left, Width e Height de uma janela maximizada ou minimizada agora contêm o local de restauração correto da janela em vez de outros valores, dependendo do monitor.
Nenhum.
Estilo e transparência do Windows Um InvalidOperationException será gerado se você tentar definir WindowStyle como um valor diferente de WindowStyle quando AllowsTransparency é true e WindowState é 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 está incluído no Windows 7 e no Windows Vista.

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

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)

Característica Diferenças de 3.5 SP1 Alterações recomendadas
caixas de diálogo Para melhorar a confiabilidade, o método ShowDialog é chamado na mesma thread de execução que criou o controle FileDialog. Certifique-se de criar um controle FileDialog e chamar o método ShowDialog na mesma linha de execução.
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 aparece no CollectionView na mesma posição relativa, se o CollectionView não estiver classificado. Isso proporciona consistência entre a posição do item na coleção e na CollectionView associada. Use o método ContainerFromItem ou IndexOf para encontrar a localização de um item em um CollectionView sem depender de um local fixo de um item.
Layouts Para eliminar os realinhamentos desnecessários, alterar o ShowsNavigationUI não invalida mais o layout nem causa outro passe de layout. 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 em pop-ups de menu, foram feitas modificações na ControlTemplate classe e no MenuItem controle e em outros controles. Os aplicativos não devem depender da estrutura visual dos modelos de controle. Somente partes nomeadas de um ControlTemplate fazem parte do contrato público. Se um aplicativo precisar encontrar 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.
Navegar Se um Frame navega diretamente para um local, a propriedade IsNavigationInitiator é true após a navegação inicial. Essa alteração impede que eventos adicionais sejam gerados durante 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 SetCurrentValue método agora permite que você defina uma propriedade como um valor efetivo, embora continue respeitando qualquer associação, estilo ou gatilho que afete a propriedade. Os autores de controle devem usar SetCurrentValue sempre que o valor da propriedade for alterado como um efeito colateral de alguma outra ação, incluindo a manipulação do usuário.
Caixas de texto Por questões de segurança, os métodos Copy e Cut falham de forma discreta quando são chamados em nível de 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, comandos de cópia e corte iniciados pelo usuário, como clicar em um botão cuja Command propriedade está associada a um desses comandos, funcionará. Os atalhos de teclado padrão para copiar e cortar, assim como o menu de contexto, continuarão funcionando como antes em um ambiente de 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, System.Windows.Media.Effects

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

Característica Diferenças de 3.5 SP1 Alterações recomendadas
Efeitos de bitmap Para melhorar o desempenho, a BitmapEffect classe e as classes que herdam da BitmapEffect classe, embora ainda presentes, estão desabilitadas. O efeito será renderizado através do pipeline de renderização acelerado por hardware se as seguintes condições forem atendidas:

* 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 BitmapEffect objeto não terá efeito.

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

O PushEffect método é marcado como obsoleto.
Descontinue usando as classes herdadas BitmapEffect e derivadas e, em vez disso, use as novas classes derivadas de Effect: BlurEffect, DropShadowEffecte ShaderEffect.

Você também pode criar seus próprios efeitos herdando da ShaderEffect classe.
Quadros de bitmap Os objetos clonados BitmapFrame agora 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 somente se todas as instruções a seguir forem verdadeiras:

* Você assinar o evento DownloadProgress, DownloadCompleted ou DownloadFailed.
* A origem do BitmapFrame é da Web.
* O BitmapFrame é clonado enquanto o download ainda está em andamento.
Verifique o remetente no manipulador de eventos e execute a ação somente se o remetente for o 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ção para IOException e use o evento DecodeFailed para verificar se há falha de 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)

Característica Diferenças de 3.5 SP1 Alterações recomendadas
Associação de instâncias de comando Para fornecer um mecanismo para associar instâncias de comando baseadas em View-Model a gestos de entrada baseados em View, a classe InputBinding agora herda de Freezable em vez de DependencyObject. As seguintes propriedades agora são propriedades de dependência:

* Command
* CommandParameter
* CommandTarget

Essa alteração resulta no seguinte:

* Um InputBinding objeto agora está congelado quando está 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.
* Você não pode alterar as associações de entrada no nível da classe após o registro, devido às restrições da Freezable classe.
* Não é possível especificar associações de entrada em instâncias de comando criadas em um Modelo de Exibição.
Se as associações forem mutáveis, crie instâncias separadas de uma classe InputBinding em threads separados; caso contrário, congele-as. Não altere uma estática InputBinding no nível da classe depois de ser registrada.
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 chaves mortas, que não produzem nenhum caractere visível, mas 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. Esse comportamento geralmente é esperado porque os aplicativos geralmente 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 focos Quando o FocusManager.GetFocusedElement(DependencyObject) método é passado para um elemento que tem a propriedade anexada IsFocusScope definida true, o método retorna um elemento que é o último elemento focado em teclado dentro desse escopo de foco se e somente se o elemento retornado pertencer ao mesmo PresentationSource objeto que o elemento que é passado para o método. Nenhum.

Automação da interface do usuário

Namespace: System.Windows, , System.Windows.Automation.Peers, System.Windows.Automation.Provider, System.Windows.Controls, , System.Windows.DataSystem.Windows.Input

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

Característica Diferenças de 3.5 SP1 Alterações recomendadas
Hierarquia de classes de exibições TreeViewAutomationPeer e TreeViewItemAutomationPeer classes herdam de ItemsControlAutomationPeer ao invés 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, o IsOffscreenCore método agora retorna false corretamente para contêineres de item que são rolados para fora da exibição. Além disso, o valor do método não é afetado pela 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 montagem Para habilitar novos recursos para automação de interface do usuário, as seguintes interfaces 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 GetClassNameCore método retorna um valor em vez de nulo. Portanto, controles como GridSplitter que herdam da classe Thumb relatarão um nome para Automação de 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, System.Windows.Markup

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

Característica Diferenças de 3.5 SP1 Alterações recomendadas
Extensão de marcação O WPF agora usa corretamente o valor do ProvideValue método em vez de retornar o MarkupExtension objeto 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 o seu aplicativo acessar um recurso que retornou um objeto MarkupExtension em versões anteriores, faça referência ao objeto retornado por ProvideValue, em vez do objeto MarkupExtension.
Analisando atributos Os atributos em XAML agora podem ter apenas um período. Por exemplo, os seguintes são válidos:

<Button Background="Red"/> (nenhum período)

<Button Button.Background = "Red"/> (um período)

O seguinte não é mais válido:

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

XML

As linhas nesta tabela descrevem melhorias nos 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)

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

Esquemas chameleon são esquemas que não têm um namespace de destino e, quando são incluídos em outro XSD, assumem o namespace de destino do esquema de importação. Eles geralmente são usados para incluir tipos comuns em um esquema.
Funções de ID A função de ID XSLT agora retorna o valor correto em vez de nulo quando um XmlReader objeto é passado para um XLST.

Se o usuário criou um XmlReader objeto de uma classe LINQ to XML usando o CreateReader método e esse XmlReader objeto foi passado para um XSLT, todas as id instâncias da função no XSLT retornaram nulo anteriormente. Esse não é um valor retornado permitido para a id função.
Atributo de namespace Para evitar a corrupção de dados, um XPathNavigator objeto agora retorna o nome local do x:xmlns atributo corretamente.
Declarações de namespace Um XmlReader objeto em uma subárvore não cria mais declarações de namespace duplicadas em um elemento XML.
Validação de esquema Para evitar a validação de esquema errônea, a XmlSchemaSet classe permite que os esquemas XSD sejam compilados de forma correta e consistente. Esses esquemas podem incluir outros esquemas; por exemplo, A.xsd pode incluir B.xsd, o que pode incluir C.xsd. Compilar qualquer um desses faz com que esse grafo de dependências seja percorrido.
Funções de script A função function-available não retorna mais incorretamente false quando a função está realmente disponível.
Uris O Load método agora 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)

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

Em versões anteriores, o resolvedor de namespace especificado foi ignorado e o XmlReader foi usado em vez disso.
Espaço em branco Para evitar a perda de dados ao criar um leitor, o Create método não descarta mais espaço em branco significativo.

A validação XML reconhece o modo de conteúdo misto, em que o texto pode ser intermixado com marcação XML. No modo misto, todo o espaço em branco é significativo e deve ser relatado.

Escrever

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)

Característica Diferenças de 3.5 SP1
Referências de entidade Para evitar a corrupção de dados, as referências de entidade não são mais entitizadas 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.
Nova manipulação de linha Para evitar a corrupção de dados, XmlWriter os objetos respeitam a opção NewLineHandling .

Consulte também