Modifiche in .NET Framework 3.5 SP1

Questo documento descrive le modifiche di progettazione che potrebbero essere necessarie per l'applicazione o l'ambiente quando si esegue l'aggiornamento da .NET Framework versione 3.5 a .NET Framework versione 3.5 Service Pack 1 (SP1).

Le modifiche si verificano per diversi motivi, tra cui correzioni per problemi di prodotto, conformità standard, feedback dei clienti e sicurezza. Questo argomento descrive solo modifiche importanti. Per informazioni sulle nuove funzionalità, vedere Novità di .NET Framework . Per fornire commenti e suggerimenti, visitare il Centro commenti e suggerimenti sui prodotti MSDN.

Le sezioni seguenti descrivono le modifiche apportate in .NET Framework versione 3.5 SP1.

Common Language Runtime

Miglioramenti delle prestazioni

Le applicazioni ora usano Prevenzione esecuzione dati per impedire tentativi di inserimento ed esecuzione del codice da percorsi di memoria non eseguibili.

La sicurezza per l'esecuzione del codice gestito (inclusi gli assembly MSIL, le immagini NGen e il codice non gestito) viene attivata da Layout dello spazio indirizzi casuale (ASLR).

Gli assembly con nome sicuro e firmato non devono più avere le firme controllate in fase di caricamento, purché siano completamente attendibili e vengano caricati in domini applicazione completamente attendibili. Questa modifica elimina i controlli ridondanti e migliora le prestazioni di avvio delle applicazioni che hanno firmato assembly ma non vengono installati nella Global Assembly Cache (GAC).

Le applicazioni avviate dalle condivisioni di rete hanno lo stesso comportamento dei file eseguibili non gestiti e operano con attendibilità completa anziché parziale.

L'attributo StringFreezingAttribute è ora ignorato. Questo attributo è stato usato per la creazione di immagini native usando il generatore di immagini native (Ngen.exe).

Il compilatore JIT (Just-In-Time) del compilatore è stato notevolmente migliorato per generare codice di qualità migliore. Tuttavia, la modifica dell'inliner ha un impatto sulle applicazioni con classi create da classi con costruttori che usano il valore di enumerazione TypeAttributes.BeforeFieldInit. L'inizializzazione statica di questi tipi è garantita in una fase prima dell'accesso a uno qualsiasi dei campi statici, ma non prima che venga richiamato un metodo statico o un costruttore di istanze. L'ora esatta in cui il costruttore di classe viene richiamato può essere diverso in .NET Framework versione 3.5 e 3.5 SP1.

Altre modifiche del compilatore JIT includono modifiche a errori di arrotondamento a virgola mobile e modifiche nella tempistica dei finalizzatori.

Non sono necessarie modifiche.

ADO.NET

Metodi CanConvertToString nelle classi Value Serializer

I metodi CanConvertToString nelle classi del serializzatore di valori nello spazio dei nomi System.Windows.Converters generano un'eccezione ArgumentException anziché restituire false.

I metodi System.Data.SqlClient.SQLDataReader.GetString e oth er Get generano un'eccezione InvalidCastException se i dati non possono essere sottoposti a cast nel tipo richiesto. I messaggi includono ora i tipi, ad esempio: "Impossibile eseguire il cast dell'oggetto di tipo "System.Decimal" per digitare "System.String".

Non sono necessarie modifiche.

SQLDataReader.GetString nelle colonne UUDT

La chiamata al metodo SQLDataReader.GetString nelle colonne tipo definito dall'utente (UDT) genera ora un'eccezione InvalidCastException anziché il messaggio di errore "Cast non è supportato da Byte[] a String".

Non sono necessarie modifiche.

C#

Le query sulle raccolte non generiche ora usano semantica di cast C# standard.

Nelle espressioni di query LINQ sulle raccolte non generiche, ad esempio System.Collections.ArrayList, la clausola from della query viene riscritta dal compilatore per includere una chiamata all'operatore Cast<T>. Cast<T> converte tutti i tipi di elemento nel tipo specificato nella clausola from nella query. Inoltre, nella versione originale di Visual C# 2008, l'operatore Cast<T> esegue anche alcune conversioni dei tipi di valore e conversioni definite dall'utente. Tuttavia, queste conversioni vengono eseguite usando la classe System.Convert anziché la semantica C# standard. Queste conversioni causano anche problemi di prestazioni significativi in determinati scenari. In Visual C# 2008 SP1 l'operatore Cast<T> viene modificato per generare un'eccezione InvalidCastException per il tipo di valore numerico e le conversioni definite dall'utente. Questa modifica elimina sia la semantica del cast C# non standard che il problema di prestazioni. Questa modifica viene illustrata nell'esempio seguente.

using System;
using System.Linq;

class Program
{
    public struct S { }
    static void Main()
    {
        var floats = new    float[] { 2.7f, 3.1f, 4.5f };
        var ints = from    int i in floats
                   select    i;

        // Visual C# 2008    SP1 throws InvalidCastException.
        foreach (var v in    ints)
               Console.Write("{0} ", v.ToString());

        // The original    release version of Visual C# 2008
        // compiles and    outputs 3 3 4
    }
}

Modifiche suggerite: se si dispone di codice che esegue query LINQ su raccolte non generiche e che il codice genera ora un'eccezione, modificare il tipo dell'espressione di query in modo che corrisponda al tipo degli elementi della raccolta in cui si esegue una query. Se è necessario eseguire una conversione di tipo valore o definita dall'utente sugli elementi, è possibile eseguire questa operazione durante l'esecuzione della query, come illustrato nell'esempio seguente:

using System;
using System.Linq;

class Program
{

    static void    Main(string[] args)
    {
        ArrayList floats =    new ArrayList();

        floats.Add(2.7f);
        floats.Add(3.1f);
        floats.Add(4.5f);

        var query = from    float f in floats
                    where    f > 3.0f
                    select    f;

        foreach (int i in    floats)
        {
            // Perform the    conversion as you
            // execute the    query.
            int num =    Convert.ToInt32(i);
               Console.Write("{0} ", num.ToString());
        }

           Console.ReadLine(); // output is 3 4
    }
}

ASP.NET, IIS

Modalità integrata IIS

Nella modalità di integrazione per Internet Information Services (IIS) 7.0, il metodo HttpServerUtility.TransferRequest usa in modo errato il metodo HTTPResponse.End per arrestare la richiesta padre. Ciò comporta la creazione di un threadAbortException , che può influire sulle prestazioni per terminare l'esecuzione di una risposta. In .NET Framework 3.5 SP1 il metodo TransferRequest termina ora la richiesta padre usando il metodo HttpApplication.CompleteRequest. Ciò termina anche la richiesta corrente in modo normale trasferendo il controllo al gestore eventi HttpApplication.EndRequest senza generare un'eccezione.

Modifiche suggerite: se è presente codice di gestione degli errori che usa il metodo TransferRequest per determinare se è stato generato ThreadAbortException , è possibile rimuovere tale codice dal blocco catch. Infine i blocchi continueranno a essere eseguiti.

Autenticazione integrata di Windows

Una modifica della sicurezza influisce sul modo in cui la autenticazione di Windows integrata viene gestita dalle classi System.Net.HttpWebRequest , System.Net.HttpListener , System.Net.Security.NegotiateStream e correlate nello spazio dei nomi System.Net. Questa modifica può influire su server Web e applicazioni client configurate per l'uso di autenticazione di Windows integrati.

Il processo di autenticazione di Microsoft Windows NT LAN Manager (NTLM) usato con autenticazione di Windows integrato include una richiesta rilasciata dal computer di destinazione inviato al computer client. Quando un computer riceve una richiesta generata, l'autenticazione avrà esito negativo a meno che la connessione non sia una connessione di back del ciclo( ad esempio, indirizzo IPv4 127.0.0.1). La classe HttpWebRequest è ora predefinita per specificare il nome host usato nell'URL della richiesta nel nome dell'entità servizio (SPN) usato nel processo di autenticazione NTLM.

Modifiche suggerite: è possibile fornire un SPN personalizzato da usare durante l'autenticazione a un dizionario di stringhe indicizzate dall'URI. Questo dizionario viene ottenuto con la proprietà System.Net.AuthenticationManager.CustomTargetNameDictionary. È anche possibile aggiungere l'impostazione del Registro di sistema seguente per eseguire il mapping dei nomi alla connessione loopback:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0\BackConnectionHostNames

CDOSYS

Le classi nello spazio dei nomi System.Web.Mail si basano sugli oggetti dati di collaborazione per i componenti di Windows 2000, che non saranno disponibili nella versione successiva di Windows (Windows 7). Di conseguenza, l'uso di queste classi in Windows 7 genererà una piattaformaNotSupportedException .

Modifiche suggerite: System.Web.Mail è stato deprecato in .NET Framework versione 2.0. Usare invece il supporto di posta elettronica nello spazio dei nomi System.Net.Mail.

ASP.NET convalida delle richieste

ASP.NET convalida della richiesta include ora il controllo per la parentesi angolare sinistra e la sequenza di caratteri del punto interrogativo: <?

Modifica inserita su ggesti: l'impatto di questa modifica deve essere minimo perché in genere non esiste alcun motivo per cui un commento XML deve essere incluso nella stringa di query della variabile cookie.

Convalida DEGLI URL

ASP.NET convalida ora parti dell'URL quando si accede da una pagina di ASP.NET. Tuttavia, quando viene usata la riscrittura dell'URL, è possibile accedere alla versione precedente dell'URL nella pagina con la proprietà Request.RawUrl.

Modifiche suggerite: disabilitare la convalida in una pagina, se necessario.

Stati sessione

I provider di stato sessione devono implementare tutti i membri definiti nella classe System.Web.SessionState.SessionStateStoreProviderBase, incluso il metodo CreateUninitializedItem. Tuttavia, questo metodo è stato chiamato solo quando lo stato di sessione senza cookie era in uso dal sito. Gli sviluppatori che non hanno usato uno stato di sessione senza cookie non hanno dovuto implementare CreateUninitializedItem in un provider personalizzato.

Con la versione di .NET Framework 3.5 SP1, il metodo CreateUninitializedItem può ora essere chiamato anche in determinate circostanze quando viene usato uno stato di sessione cookie.

Modifiche suggerite: Implementare CreateUninitializedItem nei provider personalizzati. Determinare se esiste già un elemento "live" per l'ID sessione specificato. Se un elemento non esiste, i provider devono creare un elemento per l'ID sessione.

Codifica URL

ASP.NET ora espande la codifica URL di intestazioni HTTP in uscita per includere il carattere di eliminazione (7F) e tutti i caratteri di controllo ASCII (ad eccezione della scheda orizzontale).

Modifiche suggerite: se necessario, è possibile disattivare il comportamento di codifica dell'intestazione predefinito come indicato di seguito:

<httpRuntime enableHeaderChecking="true|false" />

DefaultHTTPHandler in IIS

Anche se la classe System.Web.DefaultHTTPHandler per le applicazioni in modalità integrata è stata creata un modulo obsoleto in IIS 7.0, era ancora possibile usare. Genera ora un'eccezione PlatformNotSupported .

Modifiche suggerite: modificare la configurazione dell'applicazione in modo da funzionare correttamente in modalità integrata.

Coerenza della formattazione del numero del server e del client

Il comportamento di formattazione della funzione Number.localeFormat (eseguito nel client) è ora conforme al metodo String.Format (eseguito nel server). Ad esempio, il codice seguente restituisce 1000.00% :

String.Format("{0:p2}", 10)

Prima di .NET Framework 3.5 SP1, il codice seguente restituirà 10.00% :

String.localeFormat("{0:p2}", 10)

Ora, le impostazioni localiFormat restituiscono 1000.00% .

Non sono necessarie modifiche.

ASP.NET campi nascosti

I campi ASP.NET nascosti, ad esempio VIEWSTATE, vengono ora sottoposti a rendering all'inizio <form /> del rendering di tutti i controlli.

Modifiche suggerite: È possibile disattivare questo comportamento impostando il nuovo attributo renderingAllHiddenFieldsAtTopOfForm su false:

  <pages renderAllHiddenFieldsAtTopOfForm="false" />

Il valore predefinito è true.

Windows Presentation Foundation (WPF)

Le classi BitmapEffect sono obsolete

La classe System.Windows.Media.Effects.BitmapEffect e le relative classi derivate (BevelBitmapEffect, BitmapEffect,BlurBitmapEffect, DropShadowBitmapEffect, EmbossBitmapEffect e OuterGlowBitmapEffect), sono ora obsolete.

Modifiche suggerite: interrompere l'uso delle classi legacy BitmapEffect e derivate e usare invece le nuove classi derivate da Effect:BlurEffect, DropShadowEffect e ShaderEffect.

 È anche possibile creare effetti personalizzati derivando da ShaderEffect.

Modifica del nome dell'assembly

L'assembly che contiene il livello di rendering principale di WPF è stato rinominato da milcore.dll a wpfgfx_v0300.dll. Questo assembly non ha mai avuto API pubbliche.

Non sono necessarie modifiche.

Comportamento dei collegamenti ipertestuali

Se il valore della proprietà Hyperlink.NavigateUri cambia tra l'ora in cui l'utente passa il cursore del mouse su un collegamento ipertestuale e l'ora in cui l'utente fa clic su tale collegamento ipertestuale, lo spostamento si verificherà utilizzando l'URI ottenuto quando il cursore è posizionato sul collegamento ipertestuale.

Non sono necessarie modifiche.

Internet Explorer in modalità protetta in Windows Vista

Quando Internet Explorer è in modalità protetta in Windows Vista, le finestre di dialogo modali della funzione di avviso DHTML () e dei controlli ActiveX ospitati in HTML vengono bloccate anziché visualizzate. Inoltre, quando il controllo WebBrowser o il controllo Frame che ospita il codice HTML si trova in un'applicazione XMAL Browser (XBAP) e XBAP viene caricato tra domini in una pagina HTML, viene generata un'eccezione.

Non sono necessarie modifiche.

Metodi CanConvertToString nelle classi Value Serializer

I metodi CanConvertToString sulle classi serializzatore di valori negli spazi dei nomi System.Windows.Media.Converters e System.Windows.Media.Media3D.Converters generano un'eccezione ArgumentException anziché restituire false.

Non sono necessarie modifiche.

Windows Communication Foundation (WCF) e Windows Workflow Foundation (WF)

Corrispondenza dello schema

Lo schema corrispondente usato dalle classi UriTemplate e UriTemplateTable è stato rilassato per accettare indirizzi di base con schemi diversi da HTTP. Ora nessuna di queste classi usa lo schema o il numero di porta quando corrispondono gli URI candidati ai modelli. È stato aggiunto il supporto dei modelli per le barre finali e i valori predefiniti.

Non sono necessarie modifiche.

Miglioramenti della sicurezza per l'autenticazione

Quando un servizio è in esecuzione con un account utente con sicurezza in modalità mista, un elemento EndPointIdentity deve avere un'identità del nome dell'entità utente (UPN). Questa operazione non era necessaria con le versioni precedenti di WCF.

Modifiche suggerite: quando un client è impostato per usare l'impostazione SecurityMode.TransportWithMessageCredential (usando autenticazione di Windows, autenticazione UPN o autenticazione dell'identificazione personale), creare un'istanza della classe EndPointAddress con un'identità UPN e fornire codice personalizzato per gestire qualsiasi verifica dell'identificazione personale.

Supporto dell'attendibilità parziale per la registrazione degli eventi

L'attendibilità parziale supporta ora la registrazione limitata degli eventi. Nel registro eventi vengono registrati solo errori di attivazione del servizio, errori di traccia e errori di registrazione. Per evitare di scrivere messaggi eccessivi nel registro eventi, il numero massimo di eventi che è possibile registrare da un processo è 5.

Non sono necessarie modifiche.

Disponibilità remoteEndpointMessageProperty

L'accesso a un'istanza della classe RemoteEndpointMessageProperty quando si usa HTTP ospitato in IIS dipende dalla presenza di una richiesta attualmente attiva.  Pertanto, non può essere ottenuto dopo il completamento della richiesta (ad esempio, quando si esegue una ricezione unidirezionale).

Non sono necessarie modifiche.

Nota: Per risolvere i problemi di interruzione tardiva critici per alcune applicazioni, Microsoft prevede di fornire un aggiornamento a NET Framework 3.5 SP1 che potrebbe essere incluso in un Windows Update importante. Altre informazioni su questo aggiornamento saranno disponibili nella pagina di download di .NET Framework 3.5 SP1 nell'Area download Microsoft.

Vedere anche

.NET Framework Version and Assembly Information (Informazioni su assembly e versioni di .NET Framework)