Condividi tramite


Modifiche in .NET Framework 3.5 SP1

Questo documento descrive le modifiche alla progettazione che potrebbero essere necessarie nell'applicazione o nell'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à agli standard, feedback dei clienti e sicurezza. In questo argomento vengono descritte solo le modifiche rilevanti. Per informazioni sulle nuove funzionalità, vedere Novità di .NET Framework . Per fornire commenti e suggerimenti, visitare MSDN Product Feedback Center.

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

Common Language Runtime

miglioramenti delle prestazioni

Le applicazioni ora usano La prevenzione dell'esecuzione dei dati per impedire tentativi di inserimento ed esecuzione di codice da percorsi di memoria non eseguibili.

La sicurezza per l'esecuzione di codice gestito (inclusi assembly MSIL, immagini NGen e codice non gestito) è supportata dalla randomizzazione asLR (Address Space Layout Randomization).

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 applicazioni completamente attendibili. Questa modifica elimina i controlli ridondanti e migliora le prestazioni di avvio delle applicazioni con assembly firmati, ma non installate nella Global Assembly Cache (GAC).

Le applicazioni avviate da condivisioni di rete hanno lo stesso comportamento degli eseguibili non gestiti e operano con attendibilità totale anziché parzialmente attendibile.

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

L'inliner del compilatore JIT è stato notevolmente migliorato per generare codice di qualità migliore. Tuttavia, la modifica dell'inliner ha un impatto sulle applicazioni con classi di cui è stata creata un'istanza con costruttori che usano il valore di enumerazione TypeAttributes.BeforeFieldInit. L'inizializzazione statica di questi tipi viene garantita alla volta prima dell'accesso a uno qualsiasi dei campi statici, ma non prima che venga richiamato un metodo statico o un costruttore di istanza. L'ora esatta in cui viene richiamato il costruttore della classe può essere diversa in .NET Framework versione 3.5 e 3.5 SP1.

Altre modifiche del compilatore JIT includono modifiche agli 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 sulle classi serializzatori di valori nello spazio dei nomi System.Windows.Converters generano un ArgumentException anziché restituire false.

I metodi System.Data.SqlClient.SQLDataReader.GetStr ing e oth Get generano un InvalidCastException se non è possibile eseguire il cast dei dati 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 UDT

La chiamata al metodo SQLDataReader.GetString nelle colonne UDT (User Defined Type) genera ora un InvalidCastException anziché il messaggio di errore "Cast non è supportato da Byte[] a String".

Non sono necessarie modifiche.

C#

query su raccolte non generiche ora usano la semantica di cast C# standard.

Nelle espressioni di query LINQ su raccolte non generiche, ad esempio System.Collections.ArrayList , la clausola from della query viene riscritta dal compilatore per includere una chiamata all'operatore di> 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 di 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 cast C# non standard che il problema di prestazioni. Questa modifica è 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 tale codice genera ora un'eccezione, modificare il tipo dell'espressione di query in modo che corrisponda al tipo di elementi nella raccolta su cui si sta eseguendo 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 utilizza erroneamente 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. In questo modo la richiesta corrente viene terminata normalmente trasferendo il controllo al HttpApplication.EndRequest gestore eventi senza generare un'eccezione.

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

'autenticazione integrata di Windows

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

Il processo di autenticazione di Microsoft Windows NT LAN Manager (NTLM) utilizzato con l'autenticazione integrata di Windows include una richiesta rilasciata dal computer di destinazione che viene inviato di nuovo al computer client. Quando un computer riceve una richiesta di verifica generata, l'autenticazione avrà esito negativo a meno che la connessione non sia una connessione loopback (ad esempio, indirizzo IPv4 127.0.0.1). Per impostazione predefinita, la classe HttpWebRequest specifica 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 nome 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 su 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 PlatformNotSupportedException .

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

ASP.NET convalida delle richieste

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

Modifiche su ggested: l'impatto di questa modifica deve essere minimo perché in genere non esiste alcun motivo per includere un commento XML nella stringa di query della variabile cookie.

convalida URL

ASP.NET convalida ora parti dell'URL quando si accede da una pagina di ASP.NET. Tuttavia, quando si usa la riscrittura 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.

stato sessione

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

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

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 delle 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 è stato reso obsoleto in IIS 7.0, era comunque possibile usare . Genera ora un'eccezione PlatformNotSupported.

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

La formattazione dei numeri client e del server

Il comportamento di formattazione della funzione Number.localeFormat (eseguito sul 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)

A questo localeFormat restituisce 1000.00% .

Non sono necessarie modifiche.

ASP.NET campi nascosti

I campi ASP.NET nascosti, ad esempio VIEWSTATE, vengono ora visualizzati nella parte superiore del <form /> prima di eseguire il rendering di tutti i controlli.

Modifiche suggerite: È necessario disattivare questo comportamento impostando il nuovo attributo renderAllHiddenFieldsAtTopOfForm su false:

  <pages renderAllHiddenFieldsAtTopOfForm="false" />

Il valore predefinito è true.

Windows Presentation Foundation (WPF)

classi BitmapEffect sono obsolete

Classe System.Windows.Media.Effects.BitmapEffect, e le relative classi derivate (BevelBitmapEffect, BitmapEffectGroup, BlurBitmapEffect, DropShadowBitmapEffect, EmbossBitmapEffecte 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, DropShadowEffecte 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 collegamento ipertestuale

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, la navigazione verrà eseguita utilizzando l'URI ottenuto quando il cursore si posiziona 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 dell'avviso di DHTML () e i controlli ActiveX ospitati in HTML vengono bloccati anziché visualizzati. Inoltre, quando l'WebBrowser controllo o 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 Serializer Value

I metodi CanConvertToString sulle classi di serializzatori di valori nelle System.Windows.Media.Converters e System.Windows.Media.Media3D.Converters generano un ArgumentException anziché restituire false.

Non sono necessarie modifiche.

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

schema corrispondente

Lo schema di corrispondenza usato dalla UriTemplate e classi 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 gli URI candidati corrispondono ai modelli. È stato aggiunto il supporto dei modelli per le barre finali e i valori predefiniti.

Non sono necessarie modifiche.

miglioramenti della sicurezza di per l'autenticazione

Quando un servizio viene eseguito con un account utente con sicurezza in modalità mista, un EndPointIdentity deve avere un'identità UPN (User Principal Name). Questa operazione non è necessaria con le versioni precedenti di WCF.

Modifiche suggerite: quando un client è impostato per l'uso dell'impostazione SecurityMode.TransportWithMessageCredential (tramite autenticazione di Windows, autenticazione UPN o autenticazione 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 degli eventi limitata. Solo gli errori di attivazione del servizio, gli errori di traccia e gli errori di registrazione vengono registrati nel registro eventi. 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 del 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 può essere incluso in un importante Windows Update. Altre informazioni su questo aggiornamento saranno disponibili nella pagina di download .NET Framework 3.5 SP1 nell'Area download Microsoft.

Vedere anche

versione di .NET Framework e informazioni sugli assembly