Problemi di migrazione di .NET Framework 4

Questo articolo descrive i problemi di migrazione tra .NET Framework 3.5 Service Pack 1 e .NET Framework 4 e include correzioni, modifiche per la conformità agli standard e la protezione e modifiche basate sul feedback degli utenti. La maggior parte di queste modifiche non richiede alcuna modifica a livello di codice delle applicazioni. Per quelle che possono comportare la modifica del codice, vedere la colonna Modifiche consigliate della tabella. Le modifiche rilevanti sono suddivise in base all'area, ad esempio ASP.NET e Windows Presentation Foundation (WPF).

Per una panoramica generale dei problemi in questo articolo, vedere Guida alla migrazione a .NET Framework 4.

Per informazioni sulle nuove funzionalità, vedere Novità di .NET Framework 4.

ASP.NET e Web

Spazi dei nomi: System.Web, System.Web.Mobile, System.Web.Security, System.Web.UI.WebControls

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

Funzionalità Differenze rispetto alla versione 3.5 SP1 Modifiche consigliate
File di definizione del browser I file di definizione del browser sono stati aggiornati per includere informazioni su browser e dispositivi nuovi e aggiornati. Sono stati rimossi browser e dispositivi precedenti come Netscape Navigator e sono stati aggiunti browser e dispositivi più recenti come Google Chrome e Apple iPhone.

Se l'applicazione in uso contiene definizioni del browser personalizzate che derivano da una delle definizioni del browser rimosse, viene visualizzato un errore.

L'oggetto HttpBrowserCapabilities esposto dalla proprietà Request.Browse della pagina è gestito dai file di definizione del browser. Pertanto le informazioni restituite mediante accesso a una proprietà di quest'oggetto in ASP.NET 4 possono essere diverse dalle informazioni restituite in una versione precedente di ASP.NET.
Se l'applicazione si basa sui file di definizione del browser precedenti è possibile copiarli dalla seguente cartella:

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

Copiare i file nella cartella \CONFIG\Browsers corrispondente per ASP.NET 4. Dopo la copia dei file eseguire lo strumento della riga di comando Aspnet_regbrowsers.exe. Per altre informazioni, vedere il sito Web di https://www.asp.net/mobile.
Applicazioni figlio in esecuzione in versioni diverse di ASP.NET Le applicazioni ASP.NET 4 configurate come elementi figlio di applicazioni che eseguono versioni precedenti di ASP.NET potrebbero non avviarsi a causa di errori di compilazione o di configurazione. Gli errori specifici variano a seconda che l'applicazione sia eseguita in IIS 6.0, in IIS 7 o in IIS 7.5. È possibile apportare modifiche ai file di configurazione delle applicazioni interessate in modo che il sistema di configurazione riconosca correttamente l'applicazione ASP.NET 4. Per informazioni sulle modifiche da apportare, vedere la sezione "ASP.NET 4 Child Applications Fail to Start When Under ASP.NET 2.0 or ASP.NET 3.5 Applications" (Le applicazioni figlio ASP.NET 4 non si avviano se dipendono da applicazioni ASP.NET 2.0 o ASP.NET 3.5) nel documento ASP.NET 4 Breaking Changes (Modifiche di rilievo in ASP.NET 4) sul sito Web ASP.NET.
Modifiche a ClientID La nuova impostazione clientIDMode in ASP.NET 4 consente di specificare la modalità con cui ASP.NET genera l'attributo id per gli elementi HTML. Nelle versioni precedenti di ASP.NET il comportamento predefinito era equivalente all'impostazione AutoID di clientIDMode. L'impostazione predefinita è ora Predictable. Per altre informazioni, vedere ASP.NET Web Server Control Identification (Identificazione del controllo server Web ASP.NET). Se si usa Visual Studio per aggiornare l'applicazione da ASP.NET 2.0 o ASP.NET 3.5, lo strumento aggiunge automaticamente al file Web.config un'impostazione che mantiene il comportamento delle versioni precedenti di .NET Framework. Se tuttavia si aggiorna un'applicazione modificando il pool di applicazioni in IIS per impostare come destinazione .NET Framework 4, ASP.NET usa la nuova modalità per impostazione predefinita. Per disattivare la nuova modalità ID client, aggiungere l'impostazione seguente al file Web.config:

<pages clientIDMode="AutoID" />
Sicurezza dall'accesso di codice (CAS, Code Access Security) Le funzionalità .NET di ASP.NET 2.0 aggiunte in ASP.NET 3.5 usano il modello di sicurezza dall'accesso di codice .NET Framework 1.1 e .NET Framework 2.0. Tuttavia l'implementazione di CAS in ASP.NET 4 è stata modificata in modo sostanziale. Di conseguenza le applicazioni ASP.NET con attendibilità parziale che si basano su codice attendibile in esecuzione nella Global Assembly Cache possono bloccarsi, generando diverse eccezioni di sicurezza. Le applicazioni parzialmente attendibili che si basano su modifiche estese ai criteri CAS del computer potrebbe a loro volta bloccarsi e generare eccezioni di sicurezza. È possibile ripristinare il comportamento di ASP.NET 1.1 e 2.0 per le applicazioni ASP.NET 4 con attendibilità parziale usando il nuovo attributo legacyCasModel nell'elemento di configurazione trust, come visualizzato nell'esempio seguente:

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

Importante: il ripristino del modello di sicurezza CAS meno recente può comportare una riduzione della protezione.

Per altre informazioni sul nuovo modello di sicurezza dall'accesso di codice di ASP.NET 4, vedere Sicurezza dall'accesso di codice per applicazioni ASP.NET 4.
File di configurazione I file di configurazione radice (il file machine.config e il file radice Web.config) per .NET Framework e ASP.NET 4 sono stati aggiornati e includono la maggior parte delle informazioni di configurazione boilerplate che erano disponibili nei file Web.config delle applicazioni ASP.NET 3.5. Data la complessità dei sistemi di configurazione gestiti IIS 7 e IIS 7.5 l'esecuzione di applicazioni ASP.NET 3.5 in ASP.NET 4 e in IIS 7 e IIS 7.5 può determinare errori ASP.NET o errori IIS. Aggiornare le applicazioni ASP.NET 3.5 ad ASP.NET 4 con gli strumenti di aggiornamento progetto di Visual Studio. Visual Studio 2010 modifica automaticamente il file Web.config dell'applicazione ASP.NET 3.5 in modo che contenga le impostazioni appropriate per ASP.NET 4.

È tuttavia possibile eseguire applicazioni ASP.NET 3.5 usando .NET Framework 4 senza ricompilazione. In tal caso può essere necessario modificare manualmente il file Web.config dell'applicazione prima di eseguire l'applicazione stessa in .NET Framework 4 e in IIS 7 o IIS 7.5. La modifica specifica da apportare dipende dalla combinazione di software in uso, inclusi i Service Pack (SP). Per informazioni sulle possibili combinazioni di software interessate da questa modifica e sulla risoluzione dei problemi con combinazioni specifiche, vedere la sezione "Configuration Errors Related to New ASP.NET 4 Root Configuration" (Errori di configurazione associati alla nuova configurazione radice di ASP.NET 4) nel documento ASP.NET 4 Breaking Changes (Modifiche di rilievo in ASP.NET 4) sul sito Web ASP.NET.
Rendering dei controlli Nelle versioni precedenti di ASP.NET alcuni controlli generavano markup che non era possibile disabilitare. Per impostazione predefinita i markup di questo tipo non vengono generati in ASP.NET 4. Le modifiche per il rendering interessano i controlli seguenti:

* I controlli Image e ImageButton non eseguono più il rendering di un attributo border="0".
* La classe BaseValidator e i controlli di convalida che derivano da tale classe non eseguono più il rendering del testo in rosso per impostazione predefinita.
* Il controllo HtmlForm non esegue il rendering di un attributo name.
* Il controllo Table non esegue più il rendering di un attributo border="0".

I controlli non progettati per l'input utente (ad esempio il controllo Label) non eseguono più il rendering dell'attributo disabled="disabled" se la loro proprietà Enabled è impostata su false (o se ereditano questa impostazione da un controllo contenitore).
Se si usa Visual Studio per aggiornare l'applicazione da ASP.NET 2.0 o ASP.NET 3.5, lo strumento aggiunge automaticamente al file Web.config un'impostazione che mantiene il rendering delle versioni precedenti. Se tuttavia si aggiorna un'applicazione modificando il pool di applicazioni in IIS per impostare come destinazione .NET Framework 4, ASP.NET usa la nuova modalità di rendering per impostazione predefinita. Per disattivare la nuova modalità di rendering aggiungere l'impostazione seguente al file Web.config:

<pages controlRenderingCompatibilityVersion="3.5" />
Gestori eventi nei documenti predefiniti In ASP.NET 4, nell'elemento HTML form il rendering del valore dell'attributo action restituisce una stringa vuota quando viene effettuata una richiesta a un URL senza estensione al quale è mappato un documento predefinito. Nelle versioni precedenti di ASP.NET una richiesta a http://contoso.com dava come risultato una richiesta a Default.aspx. In tale documento il tag di apertura form veniva restituito come nell'esempio seguente:

<form action="Default.aspx" />

Anche in ASP.NET 4 una richiesta a http://contoso.com restituisce una richiesta a Default.aspx, ma ora in ASP.NET il tag di apertura HTML form viene restituito come nell'esempio seguente:

<form action="" />

Quando l'attributo action è una stringa vuota, l'oggetto DefaultDocumentModule IIS crea una richiesta figlio a Default.aspx. Nella maggior parte dei casi la richiesta figlio è trasparente per il codice dell'applicazione e la pagina Default.aspx viene eseguita normalmente. Tuttavia una potenziale interazione tra il codice gestito e la modalità integrata di IIS 7 o IIS 7.5 può interrompere il funzionamento corretto delle pagine gestite con estensione aspx durante la richiesta figlio. La richiesta figlio a un documento predefinito con estensione aspx restituisce un errore o un comportamento imprevisto se si verificano le condizioni seguenti:

* Viene inviata al browser una pagina con estensione aspx con l'attributo action dell'elemento form impostato su "".
* Il modulo viene reinserito in ASP.NET.
* Un modulo HTTP gestito legge una sezione del corpo dell'entità, ad esempio Request.Form o Request.Params. Di conseguenza il corpo dell'entità della richiesta POST viene letto nella memoria gestita. Pertanto il corpo dell'entità non è più disponibile per i moduli di codice nativo che sono in esecuzione in modalità integrata IIS 7 o IIS 7.5.
* L'oggetto DefaultDocumentModule IIS viene eseguito in una fase successiva e crea una richiesta figlio al documento Default.aspx. Tuttavia poiché il corpo dell'entità è già stato letto da un frammento di codice gestito, non è disponibile alcun corpo di entità da inviare alla richiesta figlio.
* Quando la pipeline HTTP viene eseguita per la richiesta figlio, il gestore per i file con estensione aspx viene eseguito durante la fase handler-execute.

Poiché non è presente nessun corpo dell'entità, non sono presenti variabili del modulo né uno stato di visualizzazione. Di conseguenza il gestore della pagina con estensione aspx non dispone di informazioni per determinare quale evento vada eventualmente generato. Pertanto non viene eseguito nessun gestore dell'evento di postback per la pagina con estensione aspx interessata.
Per informazioni sulla risoluzione dei problemi che possono verificarsi in seguito a questa modifica, vedere "Event Handlers Might Not Be Not Raised in a Default Document in IIS 7 or IIS 7.5 Integrated Mode" (I gestori eventi potrebbero non essere attivati in un documento predefinito in modalità integrata IIS 7 o IIS 7.5) nel documento ASP.NET 4 Breaking Changes (Modifiche di rilievo in ASP.NET 4) sul sito Web ASP.NET.
Algoritmo hash Per la protezione di dati come i cookie di autenticazione modulo e lo stato di visualizzazione, ASP.NET usa sia la crittografia che gli algoritmi hash. Per impostazione predefinita, ASP.NET 4 usa l'algoritmo HMACSHA256 per le operazioni di hash sui cookie e lo stato di visualizzazione. Le versioni precedenti di ASP.NET usano l'algoritmo meno recente HMACSHA1. Se si eseguono applicazioni che combinano ASP.NET 2.0 e ASP.NET 4 in cui i dati quali i cookie di autenticazione moduli devono funzionare con tutte le versioni di .NET Framework, è possibile configurare un'applicazione Web ASP.NET 4 per l'uso dell'algoritmo meno recente HMACSHA1 aggiungendo la seguente impostazione nel file Web.config:

<machineKey validation="SHA1" />
Hosting di controlli in Internet Explorer Non è più possibile eseguire l'hosting di controlli Windows Form in Internet Explorer, perché esistono soluzioni migliori per l'hosting di controlli sul Web. Di conseguenza gli assembly IEHost.dll e IEExec.dll sono stati rimossi da .NET Framework. Per lo sviluppo di controlli personalizzati è possibile usare le tecnologie seguenti nelle applicazioni Web:

* È possibile creare un'applicazione Silverlight e configurarla per l'esecuzione fuori dal browser. Per altre informazioni, vedere Out-of-Browser Support (Supporto out-of-browser).
* È possibile compilare un'applicazione browser XAML (XBAP) per sfruttare i vantaggi delle funzionalità WPF (nei computer client deve essere presente .NET Framework). Per altre informazioni, vedere Panoramica delle applicazioni browser XAML di WPF.
Metodi HtmlEncode e UrlEncode I metodi HtmlEncode e UrlEncode delle classi HttpUtility e HttpServerUtility sono stati aggiornati per codificare il carattere virgoletta singola (') come indicato di seguito:

* Il metodo HtmlEncode codifica le istanze della virgoletta singola come &#39;
* Il metodo UrlEncode codifica le istanze della virgoletta singola come %27
Esaminare le aree del codice in cui si usano i metodi HtmlEncode e UrlEncode e verificare che la variazione della codifica non produca alterazioni che possono avere effetto sull'applicazione.
Errori HttpException nelle applicazioni ASP.NET 2.0 Dopo l'abilitazione di ASP.NET 4 in IIS 6, le applicazioni ASP.NET 2.0 in esecuzione su IIS 6 (in Windows Server 2003 o Windows Server 2003 R2) possono generare errori come il seguente: System.Web.HttpException: Path '/[yourApplicationRoot]/eurl.axd/[Value]' was not found. * Se ASP.NET 4 non è necessario per l'esecuzione del sito Web, modificare il mapping del sito e abilitare l'uso di ASP.NET 2.0.

oppure

* Se ASP.NET 4 è necessario per l'esecuzione del sito Web, spostare le directory virtuali figlio ASP.NET 2.0 in un altro sito Web che esegue il mapping ad ASP.NET 2.0.

oppure

* Disabilitare gli URL senza estensione. Per altre informazioni, vedere "ASP.NET 2.0 Applications Might Generate HttpException Errors That Reference eurl.axd" (Le applicazioni ASP.NET 2.0 possono generare errori HttpException con riferimenti a eurl.axd) nel documento ASP.NET 4 Breaking Changes (Modifiche di rilievo in ASP.NET 4) nel sito Web ASP.NET.
Tipi di appartenenza Alcuni tipi (ad esempio MembershipProvider) usati nell'appartenenza di ASP.NET sono stati spostati da System.Web.dll a System.Web.ApplicationServices.dll. I tipi sono stati spostati per risolvere dipendenze dei livelli di architettura tra i tipi nel client e negli SKU estesi di .NET Framework. La compilazione di librerie di classi aggiornate da versioni precedenti di ASP.NET che usano tipi di appartenenza spostati potrebbe non riuscire quando tali librerie vengono usate in un progetto ASP.NET 4. In questo caso aggiungere un riferimento a System.Web.ApplicationServices.dll nel progetto della libreria di classi.
Modifiche al controllo Menu Le modifiche apportate al controllo Menu danno origine al comportamento seguente:

* Se MenuRenderingMode è impostato su List o se MenuRenderingMode è impostato su Default e ControlRenderingCompatibilityVersion è impostato su 4.0 o versioni successive, la proprietà PopOutImageUrl non ha alcun effetto.
* Se il percorso impostato nelle proprietà StaticPopOutImageUrl e DynamicPopOutImageUrl contiene una barra rovesciata (\), il rendering delle immagini non viene eseguito. Nelle versioni precedenti di ASP.NET il percorso poteva includere una barra rovesciata.
* Anziché impostare la proprietà PopOutImageUrl per singole voci di menu, impostare StaticPopOutImageUrl o DynamicPopOutImageUrl del controllo Menu padre.

oppure

Impostare MenuRenderingMode su Table o impostare MenuRenderingMode su Default e impostare ControlRenderingCompatibilityVersion su 3.5. Con queste impostazioni il controllo Menu usa il layout basato su tabella HTML che usava anche nelle versioni precedenti di ASP.NET.
* Se il percorso nella proprietà StaticPopOutImageUrl o DynamicPopOutImageUrl contiene una barra rovesciata (\), sostituirla con un carattere barra (/).
Assembly Mobile nel file Web.config Nelle versioni precedenti di ASP.NET un riferimento all'assembly System.Web.Mobile.dll è incluso nel file Web.config radice nella sezione assemblies, sotto system.web/compilation. Per migliorare le prestazioni, il riferimento a questo assembly è stato rimosso.

Nota: l'assembly System.Web.Mobile.dll e i controlli mobili ASP.NET sono inclusi in ASP.NET 4, ma sono deprecati.
Per usare tipi di questo assembly aggiungere un riferimento all'assembly nel file Web.config radice o in un file Web.config dell'applicazione.
Caching dell'output In ASP.NET 1.0 a causa di un bug le pagine nella cache che specificavano Location="ServerAndClient" come impostazione cache di output includevano nella risposta un'intestazione HTTP Vary:*. Questa intestazione comunicava ai browser client di non memorizzare mai la pagina nella cache in locale. In ASP.NET 1.1 è stato aggiunto il metodo SetOmitVaryStar che può essere chiamato per eliminare l'intestazione Vary:*. Tuttavia i report sui bug indicano che gli sviluppatori non sono a conoscenza del comportamento SetOmitVaryStar esistente.

In ASP.NET 4 l'intestazione HTTP Vary:* non viene più generata dalle risposte che specificano la direttiva seguente:

<%@ OutputCache Location="ServerAndClient" %>

Di conseguenza il metodo SetOmitVaryStar non è più necessario per eliminare l'intestazione Vary:*. Nelle applicazioni che specificano "ServerAndClient" come attributo Location le pagine possono essere memorizzate nella cache del browser senza che sia necessario chiamare SetOmitVaryStar.
Se è necessario che le pagine dell'applicazione emettano Vary:*, chiamare il metodo AppendHeader come illustrato nell'esempio seguente:

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

In alternativa è possibile impostare su "Server" il valore dell'attributo di memorizzazione nella cache dell'output Location.
Analisi della pagina Il parser di pagina per le pagine Web (file con estensione aspx) e i controlli utente (file con estensione ascx) di ASP.NET è più restrittivo in ASP.NET 4 rispetto alle versioni precedenti di ASP.NET e rileva una quantità di markup non valido superiore a quella rilevata nelle versioni precedenti. Esaminare i messaggi di errore generati durante l'esecuzione di una pagina e correggere gli errori risultanti da markup non valido.
Tipi Passport Il supporto per Passport incorporato in ASP.NET 2.0 è obsoleto e non è più riconosciuto a causa delle modifiche apportate a Passport (ora denominato SDK Live ID). Di conseguenza i tipi associati a Passport in System.Web.Security ora sono contrassegnati con l'attributo ObsoleteAttribute. Modificare qualsiasi codice che usi i tipi Passport nello spazio dei nomi System.Web.Security (ad esempio, PassportIdentity) per usare Windows Live ID SDK.
Informazioni PathInfo nella proprietà FilePath In ASP.NET 4 il valore PathInfo non è più incluso nei valori restituiti da proprietà quali FilePath, AppRelativeCurrentExecutionFilePath e CurrentExecutionFilePath. Le informazioni PathInfo ora sono disponibili in PathInfo. Considerare ad esempio il frammento di URL seguente:

/testapp/Action.mvc/SomeAction

Nelle versioni precedenti di ASP.NET le proprietà HttpRequest hanno i valori seguenti:

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

In ASP.NET 4 invece i valori delle proprietà HttpRequest sono i seguenti:

* FilePath: /testapp/Action.mvc
* PathInfo: SomeAction
Esaminare le aree del codice che usano le proprietà della classe HttpRequest per restituire informazioni sul percorso e modificare il codice in modo che rifletta le modifiche delle modalità di restituzione delle informazioni sul percorso.
Convalida delle richieste Per migliorare la convalida delle richieste, la convalida della richiesta ASP.NET viene chiamata in una fase precedente del ciclo di vita della richiesta. Di conseguenza la convalida delle richieste viene eseguita per richieste che non sono destinate a file con estensione aspx, ad esempio per chiamate al servizio Web e per gestori personalizzati. La convalida delle richieste resta attiva anche quando nella pipeline di elaborazione richieste sono in esecuzione moduli HTTP personalizzati.

In seguito a questa modifica le richieste di risorse diverse da file con estensione aspx possono generare errori di convalida delle richieste. Anche il codice personalizzato eseguito nella pipeline delle richieste (ad esempio moduli HTTP personalizzati) può generare errori di convalida delle richieste.
Se necessario è possibile ripristinare il comportamento precedente in cui la convalida richieste veniva attivata solo dalle pagine con estensione aspx. Per fare ciò usare l'impostazione seguente nel file di configurazione Web:

<httpRuntime requestValidationMode="2.0" />

Avviso: se si ripristina il comportamento precedente, assicurarsi che tutto il codice in gestori moduli e altri elementi di codice personalizzato esistenti esegua controlli degli input HTTP potenzialmente non sicuri, che potrebbero essere vettori di attacco XSS.
Routing Se si crea un sito Web di file system in Visual Studio 2010 e il sito Web si trova in una cartella il cui nome contiene un punto (.), il routing dell'URL non funziona in modo affidabile. Alcuni percorsi virtuali restituiscono un errore HTTP 404. Questo errore si verifica perché Visual Studio 2010 avvia Visual Studio Development Server usando un percorso non corretto per la directory radice virtuale. * Nella pagina Proprietà del sito Web basato su file impostare l'attributo Percorso virtuale su "/".

oppure

* Creare un progetto di applicazione Web anziché un progetto di sito Web. I progetti di applicazione Web non presentano questo problema e il routing di URL funziona anche se il nome della cartella del progetto contiene un punto.

oppure

* Creare un sito Web basato su HTTP ospitato in IIS. Sia il percorso virtuale sia la cartella del file di progetto dei siti Web ospitati in IIS possono includere punti.
Siti di SharePoint Se si prova a eseguire un sito Web ASP.NET 4 distribuito come figlio di un sito Web SharePoint che contiene un livello di attendibilità parziale personalizzato denominato WSS_Minimal, viene visualizzato l'errore seguente:

Could not find permission set named 'ASP.Net'.
Attualmente nessuna versione di SharePoint è compatibile con ASP.NET. Pertanto evitare di eseguire un sito Web ASP.NET 4 come figlio di un sito Web SharePoint.
Standard XHTML 1.1 Per abilitare la conformità XHTML 1.1 per i nuovi siti Web, i controlli ASP.NET in .NET Framework 4 generano codice HTML conforme a XHTML 1.1. Il rendering viene abilitato con l'opzione seguente nel file Web.config all'interno dell'elemento <system.Web>:

<pages controlRenderingCompatibilityVersion="4.0"/>

L'impostazione predefinita di questa opzione è 4.0. Nei progetti Web aggiornati da Visual Studio 2008 l'impostazione attivata è 3.5, per garantire la compatibilità.
Nessuno.

Memoria centrale

Funzionalità generali

Funzionalità Differenze rispetto alla versione 3.5 SP1 Modifiche consigliate
CardSpace Windows CardSpace non è più inclusa in .NET Framework. L'applicazione è disponibile separatamente. È possibile scaricare Windows CardSpace nell'Area download Microsoft.
File di configurazione È stata modificata la modalità di accesso di .NET Framework ai file di configurazione dell'applicazione. Se il file di configurazione dell'applicazione è denominato nome-applicazione.config, rinominarlo come nome-applicazione.exe.config. Ad esempio, rinominare MyApp.config come MyApp.exe.config.
Compilatore di codice C# Le classi Compiler, CompilerError e ErrorLevel che si trovavano nello spazio dei nomi Microsoft.CSharp non sono più disponibili e l'assembly corrispondente (cscompmgd.dll) non è più incluso in .NET Framework. Usare la classe CodeDomProvider e le altre classi dello spazio dei nomi System.CodeDom.Compiler. Per altre informazioni, vedere Uso di CodeDOM.
Hosting (API non gestite) Per migliorare le funzionalità di hosting, alcune API di attivazione hosting sono state deprecate. Le funzionalità di esecuzione side-by-side in-process consentono a un'applicazione di caricare e avviare più versioni di .NET Framework nello stesso processo. Ad esempio è possibile eseguire nello stesso processo applicazioni che caricano componenti o componenti aggiuntivi basati su .NET Framework 2.0 SP1 e componenti aggiuntivi basati su .NET Framework 4. I componenti di versioni precedenti continuano a usare la versione precedente di .NET Framework e i nuovi componenti usano la nuova versione. Usare le configurazioni descritte in Esecuzione side-by-side in-process.
Nuovo modello di sicurezza I criteri di sicurezza dall'accesso di codice (CAS, Code Access Security) sono stati disattivati e sostituiti con un modello semplificato, come descritto in Modifiche della sicurezza in .NET Framework 4. Se le applicazioni usano i criteri di sicurezza dall'accesso di codice può risultare necessario apportare modifiche. Per altre informazioni, vedere Migrazione e compatibilità dei criteri di sicurezza dall'accesso di codice.

Data e ora

Spazio dei nomi: System

Assembly: mscorlib (in mscorlib.dll)

Funzionalità Differenze rispetto alla versione 3.5 SP1 Modifiche consigliate
Ora legale Per garantire la coerenza con l'orologio di sistema, le proprietà di ora (ad esempio Local e Now) adottano le regole del sistema operativo anziché altri dati di .NET Framework per le operazioni con ora legale. Nessuno.
Formattazione di stringhe Per supportare una formattazione che rileva le impostazioni cultura, la struttura TimeSpan include nuovi overload dei metodi ToString, Parse e TryParse oltre ai nuovi metodi ParseExact e TryParseExact. Nessuno.

Globalizzazione

Per l'elenco delle nuove impostazioni cultura neutre e specifiche, vedere What's New in Globalization and Localization (Novità relative alla globalizzazione e alla localizzazione).

Spazio dei nomi: System.Globalization

Assembly: mscorlib (in mscorlib.dll)

Funzionalità Differenze rispetto alla versione 3.5 SP1 Modifiche consigliate
Nomi delle impostazioni cultura Le seguenti modifiche di nome interessano le impostazioni cultura Divehi, Tedesco e Afrikaans:

* CurrencyEnglishName: il nome della valuta delle impostazioni cultura Tedesco (Svizzera) (de-CH) è stato modificato da "sFr." in "Fr.".
* LongDatePattern: il formato di data estesa per le impostazioni cultura Divehi (Maldive) (dv-MV) è stato cambiato da "gg/MMMM/aaaa" a "gg/MM/aaaa".
* PMDesignator: l'indicatore P.M. delle impostazioni cultura Afrikaans (Sudafrica) (af-ZA) è stato modificato da "nm" a "PM".
Prendere nota delle modifiche dei nomi delle impostazioni cultura.
Parametro LCID Per coerenza con il comportamento previsto nelle impostazioni del server di automazione, CLR non trasferisce più le impostazioni cultura correnti per il parametro LCID alle applicazioni basate su COM non gestite. Ora vengono trasferite le impostazioni cultura 1033 (en-US). Non sono necessarie modifiche, salvo per le applicazioni native che richiedono impostazioni cultura specifiche.
Tipi di impostazioni cultura obsoleti I tipi di impostazioni cultura CultureTypes e CultureTypes sono obsoleti.

Per garantire la compatibilità con le versioni precedenti, CultureTypes ora restituisce le impostazioni cultura neutre e specifiche incluse con la versione precedente di .NET Framework e CultureTypes ora restituisce un elenco vuoto.
Usare altri valori dell'enumerazione CultureTypes.
Recupero delle impostazioni cultura A partire da Windows 7, .NET Framework 4 recupera le informazioni delle impostazioni cultura dal sistema operativo anziché archiviare i dati necessari. .NET Framework esegue anche la sincronizzazione con Windows per l'ordinamento dei dati e l'uso di maiuscole e minuscole. Nessuno.
Standard Unicode 5.1 .NET Framework ora supporta tutti i caratteri Unicode 5.1. Ciò corrisponde a un'aggiunta di circa 1400 caratteri. I caratteri aggiuntivi includono nuovi simboli, frecce, segni diacritici, punteggiatura, simboli matematici, tratti CJK e ideogrammi, caratteri numerici aggiuntivi Malayalam e Telugu e vari caratteri latini, arabi, greci, mongoli, cirillici e birmani. Unicode 5.1 supporta ora anche gli alfabeti seguenti: Sundanese, Lepcha, Ol Chiki, Vai, Saurashtra, Kayah Li, Rejang, Gurmukhi, Odia, Tamil, Telugu, Malayalam e Cham. Nessuno.

Eccezioni

Spazi dei nomi: System, System.Runtime.ExceptionServices

Assembly: mscorlib (in mscorlib.dll)

Funzionalità Differenze rispetto alla versione 3.5 SP1 Modifiche consigliate
Eccezioni per lo stato di processo danneggiato CLR non trasmette più eccezioni per lo stato di processo danneggiato ai gestori di eccezioni nel codice gestito. Queste eccezioni indicano che lo stato di un processo è danneggiato. Se viene segnalato questo stato non è consigliabile eseguire l'applicazione.

Per altre informazioni, vedere HandleProcessCorruptedStateExceptionsAttribute e la voce Handling Corrupted State Exceptions (Gestione di eccezioni per lo stato di processo danneggiato) in MSDN Magazine.
Eccezioni del motore di esecuzione ExecutionEngineException è obsoleta perché un'eccezione intercettabile consente di continuare l'esecuzione di un processo instabile. Questa modifica migliora la prevedibilità e l'affidabilità in fase di runtime. Usare InvalidOperationException per segnalare la condizione.

Reflection

Spazio dei nomi: System.Reflection

Assembly: mscorlib (in mscorlib.dll)

Funzionalità Differenze rispetto alla versione 3.5 SP1 Modifiche consigliate
Algoritmi hash degli assembly La proprietà HashAlgorithm ora restituisce AssemblyHashAlgorithm perché il runtime non conosce l'algoritmo hash dell'assembly di riferimento quando l'assembly non è caricato. Questa voce si riferisce all'uso della proprietà in un assembly di riferimento, ad esempio quello restituito dal metodo GetReferencedAssemblies. Nessuno.
Caricamento degli assembly Per evitare il caricamento ridondante di assembly e per risparmiare spazio degli indirizzi virtuali, CLR ora carica gli assembly usando solo la funzione MapViewOfFile Win32. La funzione LoadLibrary non viene più chiamata.

Questa modifica influisce sulle applicazioni di diagnostica nei modi seguenti:

* Una classe ProcessModuleCollection non contiene più moduli di una libreria di classi (file con estensione dll) ottenuti da una chiamata a Process.GetCurrentProcess().Modules.
* Le applicazioni Win32 che usano la funzione EnumProcessModules non visualizzano tutti i moduli gestiti elencati.
Nessuno.
Tipo dichiarante La proprietà DeclaringType ora restituisce correttamente null quando il tipo non dispone di un tipo dichiarante. Nessuno.
Delegati Un delegato ora genera un'eccezione ArgumentNullException anziché un'eccezione NullReferenceException quando viene passato un valore null al costruttore del delegato. Verificare che la gestione delle eccezioni rilevi ArgumentNullException.
Modifica del percorso della Global Assembly Cache Per gli assembly di .NET Framework 4, la Global Assembly Cache è stata spostata dalla directory di Windows (%WINDIR%) alla sottodirectory di Microsoft.Net (%WINDIR%\Microsoft.Net). Gli assembly delle versioni precedenti rimangono nella directory precedente.

L'enumerazione ASM_CACHE_FLAGS non gestita contiene il nuovo flag ASM_CACHE_ROOT_EX. Il flag ottiene il percorso della cache per gli assembly di .NET Framework 4, che può essere ottenuto con la funzione GetCachePath.
Nessuno a condizione che le applicazioni non usino percorsi espliciti per gli assembly, una procedura sconsigliata.
Strumento Global Assembly Cache Lo strumento Global Assembly Cache (Gacutil.exe) non supporta più il visualizzatore plug-in della shell. Nessuno.

Interoperabilità

Spazio dei nomi: System.Runtime.InteropServices

Assembly: mscorlib (in mscorlib.dll)

Funzionalità Differenze rispetto alla versione 3.5 SP1 Modifiche consigliate
Lunghezza del buffer (API non gestita) Per risparmiare memoria, la funzionalità del parametro pBufferLengthOffset per il metodo ICorProfilerInfo2::GetStringLayout è stata modificata e ora corrisponde a quella del parametro pStringLengthOffset. Ora entrambi i parametri puntano alla posizione di offset della lunghezza della stringa. La lunghezza del buffer è stata rimossa dalla rappresentazione della classe String. Rimuovere qualsiasi dipendenza della lunghezza del buffer.
Debug JIT Per semplificare la registrazione per il debug JIT, il debugger di .NET Framework ora usa solo la chiave del Registro di sistema AeDebug, che controlla il comportamento di debug JIT per il codice nativo. I risultati cambiano nel modo seguente:

* Non è più possibile registrare due debugger diversi per il codice gestito e il codice nativo.
* Non è più è possibile avviare il debugger automaticamente per un processo non interattivo, ma è possibile richiedere l'input dell'utente per un processo interattivo.
* Non si riceve più una notifica quando il debugger non si avvia o quando non è presente alcun debugger registrato da avviare.
* I criteri di avvio automatico che dipendono dall'interattività dell'applicazione non sono più supportati.
Modificare di conseguenza le operazioni di debug.
Platform invoke Per migliorare le prestazioni di interoperabilità con il codice non gestito, le convenzioni di chiamata errate in un platform invoke ora causano l'arresto dell'applicazione. Nelle versioni precedenti il livello di marshalling risolveva questi errori a monte nello stack. Il debug delle applicazioni in Microsoft Visual Studio segnala questi errori all'utente e ne consente la correzione.

Se sono presenti file binari non aggiornabili, è possibile includere l'elemento <NetFx40_PInvokeStackResilience> elemento nel file di configurazione dell'applicazione per abilitare la risoluzione degli errori di chiamata a monte nello stack, come nelle versioni precedenti. Tuttavia questa impostazione può ridurre le prestazioni dell'applicazione.
Interfacce rimosse (API non gestita) Per evitare di confondere gli sviluppatori le interfacce seguenti sono state rimosse, perché non offrono alcuno scenario di runtime utile e il CLR non offre né accetta nessuna implementazione:

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

Dati

In questa sezione vengono descritti i problemi di migrazione per l'uso di set di dati e SQL Client, Entity Framework, LINQ to SQL e WCF Data Servers (denominato in precedenza ADO.NET Data Services).

Set di dati e SQL Client

La tabella seguente presenta i miglioramenti apportati a funzionalità che in precedenza avevano limitazioni o altri problemi.

Spazi dei nomi: System.Data, System.Data.Objects.DataClasses, System.Data.SqlClient

Assembly: System.Data (in System.Data.dll), System.Data.Entity (in System.Data.Entity.dll)

Funzionalità Differenze rispetto alla versione 3.5 SP1
Scenari POCO L'interfaccia IRelatedEnd dispone di nuovi metodi per migliorare l'usabilità negli scenari POCO (Plain Old CLR Object). I nuovi metodi accettano come parametro un'entità Object anziché un'entità IEntityWithRelationships.
Modifica di righe Il metodo IndexOf implementato dalla classe DataView ora restituisce correttamente il valore di una riga modificata, anziché restituire -1.
Eventi L'evento PropertyChanged ora viene generato quando una riga è in uno stato modificato e viene chiamato il metodo RejectChanges. Questa modifica rende più semplice la creazione di controlli dell'interfaccia utente che espongono il contenuto di un oggetto DataSet.
Eccezioni Il metodo Prepare ora genera un'eccezione InvalidOperationException anziché NullReferenceException quando una connessione non è impostata o aperta.
Mapping delle visualizzazioni Gli errori di mapping della visualizzazione di query vengono ora rilevati in fase di progettazione anziché generare un'eccezione NullReferenceException in fase di esecuzione.

La convalida di mapping ora rileva l'errore per il quale in Conceptual Schema Definition Language (CSDL) viene eseguito il mapping di due set di associazioni sulla stessa colonna.
Transazioni Se un'applicazione prova a eseguire un'istruzione su una connessione dopo che una transazione è stata completata (anche se interrotta o sottoposta a rollback), ora viene generata un'eccezione InvalidOperationException. Nelle versioni precedenti non veniva generata un'eccezione ed era possibile eseguire comandi aggiuntivi anche se una transazione veniva interrotta.

Entity Framework

La tabella seguente presenta i miglioramenti apportati a funzionalità che in precedenza avevano limitazioni o altri problemi.

Spazi dei nomi: System.Data, System.Data.Objects, System.Data.Objects.DataClasses

Assembly: System.Data.Entity (in System.Data.Entity.dll)

Funzionalità Differenze rispetto alla versione 3.5 SP1
Oggetti entità Ora è presente la parità tra il metodo Detach e lo stato dell'oggetto entità quando viene chiamato il metodo SaveChanges. Questo miglioramento della coerenza evita la generazione di eccezioni impreviste.
Entity SQL Sono state migliorate le regole per la risoluzione di identificatori in Entity SQL.

Il parser Entity SQL dispone di logica migliorata per la risoluzione di identificatori a più parti.
Annotazioni strutturali Entity Framework ora riconosce le annotazioni strutturali.
Query Sono stati apportati i seguenti miglioramenti alle query:

* Una query GroupBy che usa una chiave Null in una raccolta vuota non restituisce nessuna riga, anche se la query include altre clausole select.
* Per impostazione predefinita, il codice SQL generato in query LINQ ed Entity SQL ora interpreta i parametri stringa come valori non Unicode.

LINQ to SQL

La tabella seguente presenta i miglioramenti apportati a funzionalità che in precedenza avevano limitazioni o altri problemi.

Spazio dei nomi: System.Data.Linq

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

Funzionalità Differenze rispetto alla versione 3.5 SP1
Eventi Una raccolta EntitySet<TEntity> attiva ora l'evento ListChanged per operazioni di aggiunta e rimozione se EntitySet<TEntity> viene scaricata, oltre ad attivare l'evento quando la raccolta viene caricata.
Query Skip(0) non viene più ignorato nelle query LINQ to SQL. Di conseguenza è possibile che le query con questo metodo funzionino in modo diverso. Ad esempio in determinati casi una clausola OrderBy è obbligatoria con Skip(0) e ora la query genera un'eccezione NotSupportedException se la clausola OrderBy non è inclusa.

WCF Data Services

La tabella seguente presenta i miglioramenti apportati a funzionalità che in precedenza avevano limitazioni o altri problemi.

Spazi dei nomi: System.Data.Services, System.Data.Services.Client, System.Data.Services.Common, System.Data.Services.Providers

Assembly: System.Data.Services (in System.Data.Services.dll), System.Data.Services.Client (in System.Data.Services.Client.dll)

Funzionalità Differenze rispetto alla versione 3.5 SP1
Contenuto binario in batch WCF Data Services ora supporta il contenuto binario in batch nelle richieste e nelle risposte.
Intercettori di modifiche Gli intercettori di modifiche ora vengono eseguiti per le richieste DELETE.

Un intercettore di modifiche è un metodo che viene eseguito ogni volta che il server riceve una richiesta di modifica di un'entità del set di entità. Viene eseguito prima della richiesta in arrivo. L'intercettore di modifiche offre l'accesso all'entità che viene modificata e all'operazione da eseguire su tale entità.
Eccezioni Le condizioni seguenti ora generano eccezioni più utili di NullReferenceException:

* Un'eccezione TimeoutException quando una chiamata a un servizio dati raggiunge il timeout.
* Un'eccezione DataServiceRequestException quando viene effettuata una richiesta errata a un servizio dati.

Nelle applicazioni è consigliabile modificare la gestione delle eccezioni per intercettare le nuove eccezioni.
Intestazioni Sono stati apportati i seguenti miglioramenti alle intestazioni:

* WCF Data Services ora rifiuta correttamente un'intestazione eTag che include un valore non specificato.
* WCF Data Services ora restituisce un errore e non esegue la richiesta di eliminazione per un collegamento quando la richiesta include un'intestazione if-*.
* WCF Data Services ora restituisce un errore al client nel formato (Atom, JSON) specificato dal client nell'intestazione Accept.
Lettore JSON Il lettore JavaScript Object Notation (JSON) ora restituisce correttamente un errore quando legge il carattere di escape barra rovesciata singola ("\") durante l'elaborazione di payload JSON inviati a un servizio WCF Data Services.
Unioni Sono stati apportati i seguenti miglioramenti all'enumerazione MergeOption:

* L'opzione di unione MergeOption non modifica più l'entità sul client in seguito a qualsiasi risposta successiva da un servizio dati.
* L'opzione MergeOption è ora coerente tra aggiornamenti SQL dinamici e aggiornamenti basati su stored procedure.
Richieste Prima dell'elaborazione di una richiesta a un servizio dati ora viene chiamato un metodo OnStartProcessingRequest. In questo modo la richiesta funziona correttamente per i servizi ServiceOperation.
Flussi WCF Data Services non chiude più il flusso sottostante per operazioni di lettura e scrittura.
URI L'escape di URI da parte del client WCF Data Services è stato corretto.

Windows Communication Foundation (WCF)

La tabella seguente presenta i miglioramenti apportati a funzionalità che in precedenza avevano limitazioni o altri problemi.

Funzionalità Differenze rispetto alla versione 3.5 SP1
File di configurazione Per abilitare l'ereditarietà dei comportamenti attraverso la gerarchia di file di configurazione, WCF ora supporta l'unione tra i file di configurazione.

Il modello di ereditarietà di configurazione è stato espanso e consente agli utenti di definire i comportamenti che verranno applicati a tutti i servizi in esecuzione nel computer.

Se sono presenti comportamenti con lo stesso nome a livelli diversi della gerarchia è possibile che si riscontrino differenze a livello di comportamento.
Hosting di servizi Non è più possibile specificare l'elemento di configurazione <serviceHostingEnvironment> a livello di servizio aggiungendo l'attributo allowDefinition="MachineToApplication" alla definizione dell'elemento.

La specifica dell'elemento <serviceHostingEnvironment> a livello di servizio è tecnicamente errata e determina un comportamento incoerente.

Windows Presentation Foundation (WPF)

Applicazioni

Spazi dei nomi: System.Windows, System.Windows.Controls

Assembly: PresentationFramework (in PresentationFramework.dll)

Funzionalità Differenze rispetto alla versione 3.5 SP1 Modifiche consigliate
Gestione delle eccezioni Per abilitare un rilevamento più rapido degli errori, WPF genera un TargetInvocationException e imposta la proprietà InnerException per eccezioni critiche come NullReferenceException, OutOfMemoryException, StackOverflowException e SecurityException anziché rilevare l'eccezione originale. Nessuno.
Linked Resources Per semplificare il collegamento, quando l'applicazione viene compilata i file di risorse (ad esempio immagini) che si trovano in un percorso diverso dalla struttura di cartelle del progetto usano come ID di risorsa il percorso completo del file di risorse anziché il solo nome file. L'applicazione sarà in grado di trovare i file in fase di esecuzione. Nessuno.
Applicazioni con attendibilità parziale Per motivi di sicurezza, le applicazioni per Windows eseguite con attendibilità parziale che contengono un controllo WebBrowser o un controllo Frame con codice HTML generano un SecurityException al momento della creazione del controllo.

Le applicazioni browser generano un'eccezione e visualizzano un messaggio se vengono soddisfatte tutte le condizioni seguenti:

* L'applicazione è in esecuzione in Firefox.
* L'applicazione è in esecuzione con attendibilità parziale nell'area Internet da siti non attendibili.
* L'applicazione contiene un controllo WebBrowser o un controllo Frame che a sua volta contiene codice HTML.

Le applicazioni eseguite da siti attendibili o dall'area intranet funzionano normalmente.
Nelle applicazioni browser è possibile attenuare l'effetto di questa modifica eseguendo una di queste operazioni:

* Eseguire l'applicazione browser con attendibilità totale.
* Chiedere ai clienti di aggiungere il sito dell'applicazione all'area siti attendibili.
Dizionari risorse Per migliorare i dizionari risorse a livello di tema e impedirne la modifica, le risorse bloccabili definite in un dizionario risorse e unite in un dizionario a livello di tema ora sono sempre contrassegnate come bloccate e non sono modificabili. Questo è il comportamento previsto per le risorse bloccabili. Le applicazioni che modificano una risorsa definita in un dizionario unito a livello di tema devono duplicare la risorsa e modificare la copia duplicata. In alternativa è possibile contrassegnare la risorsa come x:Shared="false" in modo che ResourceDictionary crei una nuova copia ogni volta che viene eseguita una query sulla risorsa.
Windows 7 Per migliorare il funzionamento delle applicazioni WPF in Windows 7 sono stati apportati i miglioramenti seguenti per correggere il comportamento delle finestre:

* Gli stati di ancoraggio e i movimenti ora rispondono come previsto a seconda delle interazioni degli utenti.
* I comandi della barra delle applicazioni Sovrapponi finestre, Mostra le finestre in pila e Mostra le finestre affiancate ora funzionano correttamente e aggiornano le proprietà appropriate.
* Le proprietà Top, Left, Width e Height per una finestra ingrandita o ridotta a icona ora contengono il percorso di ripristino della finestra corretto invece di altri valori, a seconda del monitor.
Nessuno.
Stile di Windows e trasparenza Viene generata un'eccezione InvalidOperationException se si prova a impostare WindowStyle su un valore diverso da WindowStyle quando AllowsTransparency è true e WindowState è WindowState. Se è necessario modificare WindowStyle quando AllowsTransparency è true, è possibile chiamare la funzione Win32 SetWindowLongPtr.
XPS Viewer WPF non include Microsoft XML Paper Specification Essentials Pack (XPSEP). XPSEP è incluso in Windows 7 e Windows Vista.

In un computer che esegue Windows XP senza .NET Framework 3.5 SP1, la stampa con un'API WPF diversa da quelle presenti in PrintDialog viene eseguita mediante WINSPOOL. Alcune funzionalità della stampante non vengono comunicate e alcune impostazioni della stampante non vengono applicate durante la stampa.
Se necessario, installare Microsoft XML Paper Specification Essentials Pack.

Controlli

Spazi dei nomi: System.Windows, System.Windows.Controls, System.Windows.Data, System.Windows.Input

Assembly: PresentationFramework (in PresentationFramework.dll), PresentationCore (in PresentationCore.dll), WindowsBase (in WindowsBase.dll)

Funzionalità Differenze rispetto alla versione 3.5 SP1 Modifiche consigliate
Finestre di dialogo Per migliorare l'affidabilità, il metodo ShowDialog viene chiamato sullo stesso thread che ha creato il controllo FileDialog. Assicurarsi di creare un controllo FileDialog e di chiamare il metodo ShowDialog sullo stesso thread.
Finestre mobili Per correggere la logica di ripristino dello stato attivo che continua a riattivare in modo errato una finestra mobile (rendendola simile a una finestra di dialogo modale), il ripristino dello stato attivo ora viene bloccato se la destinazione non è un elemento figlio della finestra. Nessuno.
Elementi di raccolte Quando un elemento viene spostato o aggiunto a una raccolta sottostante, appare in CollectionView nello stesso percorso relativo se CollectionView non è ordinata. Ciò garantisce la coerenza tra la posizione dell'elemento nella raccolta e nella CollectionView associata. Usare il metodo ContainerFromItem o IndexOf per trovare il percorso di un elemento in una CollectionView anziché basarsi sul percorso fisso dell'elemento.
Layout Per eliminare rigenerazioni di layout non necessarie, la modifica di ShowsNavigationUI non imposta più il layout come non valido e non attiva un altro passaggio di layout. Se è previsto che la modifica di ShowsNavigationUI attivi un altro passaggio di layout, chiamare InvalidateVisual dopo l'impostazione della proprietà.
Menu Per abilitare il testo ClearType nei menu popup sono state apportate modifiche alla classe ControlTemplate, al controllo MenuItem e ad altri controlli. È consigliabile evitare che le applicazioni dipendano dalla struttura visiva dei modelli di controllo. Nel contratto pubblico sono incluse solo le parti denominate di un ControlTemplate. Se un'applicazione deve trovare un determinato oggetto in un ControlTemplate è consigliabile eseguire la ricerca di un tipo specifico nella struttura ad albero visuale anziché basarsi sul percorso fisso di un oggetto nella struttura ad albero.
Esplorazione Se un Frame passa direttamente a un percorso, la proprietà IsNavigationInitiator è true dopo l'esplorazione iniziale. Questa modifica impedisce l'attivazione di eventi aggiuntivi negli scenari di avvio. Nessuno.
Elementi popup Il delegato CustomPopupPlacementCallback ora può essere chiamato più volte (anziché una sola volta) durante un passaggio di layout. Se il delegato CustomPopupPlacementCallback calcola la posizione di un Popup in base alla posizione precedente, ricalcolare la posizione solo se cambiano i valori dei parametri popupSize, targetSize, o offset.
Valori delle proprietà Il metodo SetCurrentValue ora consente di impostare una proprietà su un valore effettivo, anche se continuano a essere rispettati i binding, gli stili o i trigger che hanno effetto sulla proprietà. È consigliabile che gli autori di controlli usino SetCurrentValue ogni volta che il valore della proprietà viene modificato come effetto secondario di un'altra azione, tra cui una modifica apportata dall'utente.
Caselle di testo Per motivi di sicurezza i metodi Copy e Cut chiamati con attendibilità parziale si interrompono senza avvisi.

Con l'attendibilità parziale viene anche bloccata l'esecuzione a livello di codice della proprietà Copy o Cut su un controllo che eredita da TextBoxBase. Funzionano invece i comandi di tipo copia e incolla avviati dall'utente, ad esempio il clic su un pulsante la cui proprietà Command è associata a uno di questi comandi. Le operazioni copia e incolla con scelte rapide da tastiera o con le opzioni del menu contestuale funzionano nel modo consueto con l'attendibilità parziale.
Impostare il binding del comando Copy o Cut a un'azione avviata dall'utente, ad esempio un clic su un pulsante.

Grafica

Spazi dei nomi: System.Windows, System.Windows.Controls, System.Windows.Data, System.Windows.Input, System.Windows.Media.Effects

Assembly: PresentationFramework (in PresentationFramework.dll), PresentationCore (in PresentationCore.dll), WindowsBase (in WindowsBase.dll)

Funzionalità Differenze rispetto alla versione 3.5 SP1 Modifiche consigliate
Effetti bitmap Per migliorare le prestazioni, la classe BitmapEffect e le classi che ereditano dalla classe BitmapEffect sono ancora presenti ma disattivate. Il rendering dell'effetto verrà eseguito tramite la pipeline di rendering con accelerazione hardware se sono soddisfatte le condizioni seguenti:

* L'applicazione usa un DropShadowBitmapEffect o un BlurBitmapEffect con la proprietà radius impostata su un valore inferiore a 100 DIU.
* La scheda video del computer che esegue l'applicazione supporta Pixel Shader 2.0.

Se non vengono soddisfatte queste condizioni, un oggetto BitmapEffect non ha alcun effetto.

Visual Studio produce un avviso del compilatore anche quando rileva l'oggetto BitmapEffect o una sottoclasse.

Il metodo PushEffect è contrassegnato come obsoleto.
È consigliabile evitare di usare la classe legacy BitmapEffect e le classi derivate e usare invece le nuove classi derivate da Effect: BlurEffect, DropShadowEffect e ShaderEffect.

È anche possibile creare effetti personalizzati con l'ereditarietà dalla classe ShaderEffect.
Fotogrammi bitmap Gli oggetti BitmapFrame clonati ora ricevono gli eventi DownloadProgress, DownloadCompleted e DownloadFailed. In questo modo le immagini scaricate dal Web e applicate al controllo Image con un Style vengono elaborate correttamente.

Si rileva una modifica del comportamento solo se tutte le affermazioni seguenti sono vere:

* Si esegue la sottoscrizione all'evento DownloadProgress, DownloadCompleted o DownloadFailed.
* L'origine del BitmapFrame è il Web.
* Il BitmapFrame viene duplicato mentre è ancora in corso il download.
Controllare il mittente nel gestore dell'evento e intervenire solo se il mittente è il BitmapFrame originale.
Decodifica di immagini Per evitare che un IOException non venga gestito quando non è possibile decodificare le immagini, la classe BitmapSource genera l'evento DecodeFailed quando non decodifica un'immagine. Rimuovere la gestione eccezioni per IOException e usare l'evento DecodeFailed per verificare la presenza di errori di decodifica.

Input

Spazi dei nomi: System.Windows, System.Windows.Controls, System.Windows.Data, System.Windows.Input

Assembly: PresentationFramework (in PresentationFramework.dll), PresentationCore (in PresentationCore.dll), WindowsBase (in WindowsBase.dll)

Funzionalità Differenze rispetto alla versione 3.5 SP1 Modifiche consigliate
Binding di istanze di comandi Per offrire un meccanismo per il binding di istanze di comandi basate su View-Model a movimenti di input basati su View, la classe InputBinding ora eredita da Freezable anziché da DependencyObject. Le proprietà seguenti sono ora proprietà di dipendenza:

* Command
* CommandParameter
* CommandTarget

I risultati cambiano nel modo seguente:

* Un oggetto InputBinding ora è bloccato durante la registrazione anziché rimanere modificabile.
* Non è possibile accedere a oggetti InputBinding di livello istanza da più thread a causa di restrizioni della classe DependencyObject.
* Non è possibile modificare i binding di input a livello di classe dopo la registrazione a causa di restrizioni della classe Freezable.
* Non è possibile specificare binding di input nelle istanze di comando che vengono create in un ambiente View-Model.
Se i binding devono essere modificabili, creare istanze distinte di una classe InputBinding su thread separati oppure bloccarle in un altro modo. Non modificare un InputBinding statico di livello classe dopo che è stato registrato.
Applicazioni browser Le applicazioni browser WPF (con estensione xbap) ora elaborano gli eventi chiave come le applicazioni WPF standalone, per cui gli oggetti ricevono eventi chiave indirizzati nell'ordine corretto. Nessuno.
Combinazioni di tasti a cui non è associata alcuna funzione WPF disattiva i tasti a cui non è associata alcuna funzione che non producono caratteri visibili, ma indica che il tasto va combinato con il tasto lettera contiguo per produrre un carattere. Gli eventi di input dei tasti, ad esempio l'evento KeyDownEvent, segnalano quando un tasto non è associato ad alcuna funzione impostando la proprietà Key sul valore Key. Questo comportamento è in genere previsto perché le applicazioni non rispondono a input da tastiera che creano un carattere combinato. Le applicazioni che prevedono la lettura di tasti che fanno parte di un carattere combinato possono ottenere il tasto disattivato usando la proprietà DeadCharProcessedKey.
Gestione dello stato attivo Quando il metodo FocusManager.GetFocusedElement(DependencyObject) riceve un elemento la cui proprietà associata IsFocusScope è impostata su true restituisce un elemento corrispondente all'ultimo elemento attivato da tastiera nell'ambito di attivazione corrente solo se l'elemento restituito appartiene allo stesso oggetto PresentationSource al quale appartiene l'elemento passato al metodo. Nessuno.

Automazione interfaccia utente

Spazio dei nomi: System.Windows, System.Windows.Automation.Peers, System.Windows.Automation.Provider, System.Windows.Controls, System.Windows.Data, System.Windows.Input

Assembly: PresentationFramework (in PresentationFramework.dll), PresentationCore (in PresentationCore.dll), UIAutomationProvider (in UIAutomationProvider.dll), WindowsBase (in WindowsBase.dll)

Funzionalità Differenze rispetto alla versione 3.5 SP1 Modifiche consigliate
Gerarchia di classi delle viste Le classi TreeViewAutomationPeer e TreeViewItemAutomationPeer ereditano da ItemsControlAutomationPeer anziché da FrameworkElementAutomationPeer. Se si eredita dalle classi TreeViewItemAutomationPeer e si esegue l'override del metodo GetChildrenCore considerare la possibilità di restituire un oggetto che eredita dalla nuova classe TreeViewDataItemAutomationPeer.
Contenitori fuori schermo Per la correzione di un valore restituito errato, il metodo IsOffscreenCore ora restituisce correttamente false per i contenitori di elementi che vengono fatti scorrere fuori dalla vista. Il valore del metodo non è interessato dall'occlusione da parte di altre finestre o dal fatto che l'elemento sia o non sia visibile su un monitor specifico. Nessuno.
Menu e oggetti figlio Per abilitare l'automazione interfaccia utente di menu che contengono elementi figlio diversi da oggetti MenuItem, il metodo GetChildrenCore restituisce l'oggetto AutomationPeer di un oggetto UIElement figlio anziché un oggetto MenuItemAutomationPeer. Nessuno.
Nuove interfacce e assembly Per abilitare le nuove funzionalità di automazione interfaccia utente sono state aggiunte le interfacce seguenti:

* IItemContainerProvider
* ISynchronizedInputProvider
* IVirtualizedItemProvider
Qualsiasi progetto che compila peer di automazione WPF deve aggiungere un riferimento esplicito a UIAutomationProvider.dll.
Miniature Il metodo GetClassNameCore restituisce un valore anziché null. Di conseguenza, i controlli come GridSplitter che ereditano dalla classe Thumb segnalano un nome ad Automazione interfaccia utente. Nessuno.
Elementi virtualizzati Per migliorare le prestazioni, il metodo GetChildrenCore restituisce solo gli oggetti figlio che si trovano effettivamente nella struttura ad albero visuale anziché tutti gli oggetti figlio, virtualizzati o meno. Usare ItemContainerPattern per l'iterazione su tutti gli elementi di un ItemsControlAutomationPeer.

XAML

Spazi dei nomi: System.Windows, System.Windows.Controls, System.Windows.Data, System.Windows.Input, System.Windows.Markup

Assembly: PresentationFramework (in PresentationFramework.dll), PresentationCore (in PresentationCore.dll), WindowsBase (in WindowsBase.dll)

Funzionalità Differenze rispetto alla versione 3.5 SP1 Modifiche consigliate
Estensione di markup Quando un'estensione di markup viene usata per impostare una proprietà o per creare un elemento in una raccolta, WPF ora usa sempre correttamente il valore del metodo ProvideValue anziché restituire in alcuni casi l'oggetto MarkupExtension. In determinati casi è possibile che un'estensione di markup restituisca se stessa. Se l'applicazione accede a una risorsa che ha restituito un oggetto MarkupExtension nelle versioni precedenti, fare riferimento all'oggetto restituito da ProvideValue anziché all'oggetto MarkupExtension.
Analisi degli attributi Gli attributi in XAML ora possono avere un solo punto. Di seguito sono riportati esempi validi:

<Button Background="Red"/> (nessun punto)

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

L'elemento seguente non è più valido:

<Button Control.Button.Background = "Red"/> (più di un punto)
Correggere gli attributi XAML che hanno più di un punto.

XML

Questa tabella descrive miglioramenti a funzionalità che in precedenza presentavano limitazioni o altri problemi.

Schema e trasformazioni

Spazi dei nomi: System.Xml.Linq; System.Xml.Schema, System.Xml.XPath

Assembly: System.Xml (in System.Xml.dll), System.Xml.Linq (in System.Xml.Linq.dll)

Funzionalità Differenze rispetto alla versione 3.5 SP1
Schemi camaleonte Per evitare il danneggiamento dei dati, ora gli schemi camaleonte vengono duplicati correttamente quando sono inclusi in più schemi.

Gli schemi camaleonte sono schemi che non dispongono di uno spazio dei nomi di destinazione e quando vengono inclusi in un altro schema XSD adottano lo spazio dei nomi di destinazione dello schema di importazione. Vengono spesso usati per includere tipi comuni in uno schema.
Funzioni ID La funzione id XSLT ora restituisce il valore corretto anziché null quando un oggetto XmlReader viene passato a un XLST.

In precedenza, quando l'utente creava un oggetto XmlReader da una classe LINQ to XML usando il metodo CreateReader e questo oggetto XmlReader veniva passato a un XSLT, le eventuali istanze della funzione id nell'XSLT restituivano null. Questo valore restituito non è consentito per la funzione id.
Attributo namespace Per evitare il danneggiamento dei dati, ora un oggetto XPathNavigator restituisce correttamente il nome locale dell'attributo x:xmlns.
Dichiarazioni dello spazio dei nomi Un oggetto XmlReader in una sottostruttura non crea più dichiarazioni dello spazio dei nomi duplicate all'interno di un elemento XML.
Convalida dello schema Per impedire errori nella convalida dello schema, la classe XmlSchemaSet consente la compilazione corretta e coerente degli schemi XSD. Questi schemi possono includere altri schemi, ad esempio A.xsd può includere B.xsd che a sua volta può includere C.xsd. La compilazione di uno di questi elementi determina l'attraversamento di questa struttura di dipendenze.
Funzioni di script La funzione function-available non restituisce più erroneamente false quando la funzione è di fatto disponibile.
URI Il metodo Load ora restituisce il BaseURI corretto nelle query LINQ.

Convalida

Spazi dei nomi: System.Xml.Linq; System.Xml.Schema, System.Xml.XPath

Assembly: System.Xml (in System.Xml.dll), System.Xml.Linq (in System.Xml.Linq.dll)

Funzionalità Differenze rispetto alla versione 3.5 SP1
Risolutori dello spazio dei nomi Il metodo ReadContentAs non ignora più il resolver IXmlNamespaceResolver passato al metodo stesso.

Nelle versioni precedenti il resolver dello spazio dei nomi specificato veniva ignorato e veniva invece usato XmlReader.
Spazi vuoti Per evitare la perdita di dati quando si crea un lettore, il metodo Create non rimuove più gli spazi vuoti significativi.

La convalida XML riconosce la modalità contenuto misto in cui il testo può essere alternato a markup XML. In modalità mista tutti gli spazi vuoti sono significativi e devono essere segnalati.

Scrittura

Spazi dei nomi: System.Xml.Linq; System.Xml.Schema, System.Xml.XPath

Assembly: System.Xml (in System.Xml.dll), System.Xml.Linq (in System.Xml.Linq.dll)

Funzionalità Differenze rispetto alla versione 3.5 SP1
Riferimenti entità Per evitare il danneggiamento dei dati i riferimenti alle entità non vengono più ripetuti due volte negli attributi XML.

Se l'utente cercava di scrivere un'entità in un attributo xmlns o in un attributo xml:lang o xml:space con il metodo WriteEntityRef l'entità veniva ripetuta due volte nell'output e i dati risultavano danneggiati.
Gestione dei valori di nuova riga Per evitare il danneggiamento dei dati ora gli oggetti XmlWriter rispettano l'opzione NewLineHandling.

Vedi anche