Modifiche di runtime per la migrazione a .NET Framework 4.6.x

Questo articolo elenca i problemi di compatibilità delle applicazioni introdotti in .NET Framework 4.6, 4.6.1 e 4.6.2.

.NET Framework 4.6

ASP.NET

GridViews con AllowCustomPaging impostato su true può generare l'evento PageIndexChanging quando si esce dalla pagina finale della visualizzazione

Dettagli

A causa di un bug in .NET Framework 4.5, System.Web.UI.WebControls.GridView.PageIndexChanging a volte non viene generato per le classi System.Web.UI.WebControls.GridView che hanno abilitato la proprietà System.Web.UI.WebControls.GridView.AllowCustomPaging.

Suggerimento

Questo problema è stato corretto in .NET Framework 4.6 e può essere risolto eseguendo l'aggiornamento a tale versione di .NET Framework. Come soluzione alternativa, l'app può eseguire un'operazione BindGrid esplicita su qualsiasi Page_Load che soddisfi queste condizioni (la classe System.Web.UI.WebControls.GridView è nell'ultima pagina e la proprietà LastSystem.Web.UI.WebControls.GridView.PageSize è diversa da System.Web.UI.WebControls.GridView.PageSize). Oppure è possibile modificare l'app in modo da consentire il paging (anziché il paging personalizzato), poiché in questo scenario il problema non si verifica.

Nome valore
Scope Secondarie
Versione 4.5
Type esecuzione

API interessate

Memoria centrale

Un oggetto ConcurrentDictionary serializzato in .NET Framework 4.5 con NetDataContractSerializer non può essere deserializzato da .NET Framework 4.5.1 o 4.5.2

Dettagli

A causa di modifiche interne al tipo, non è possibile deserializzare in .NET Framework 4.5.1 o in .NET Framework 4.5.2 gli oggetti ConcurrentDictionary<TKey,TValue> serializzati con .NET Framework 4.5 usando System.Runtime.Serialization.NetDataContractSerializer. L'operazione nella direzione opposta, ovvero la serializzazione con .NET Framework 4.5.x e la deserializzazione con .NET Framework 4.5, invece funziona. In modo analogo, tutte le operazioni di serializzazione tra le diverse versioni 4.x funziona con .NET Framework 4.6. La serializzazione e la deserializzazione con una singola versione di .NET Framework non è interessata.

Suggerimento

Se è necessario serializzare e deserializzare un System.Collections.Concurrent.ConcurrentDictionary<TKey,TValue> tra .NET Framework 4.5 e .NET Framework 4.5.1/4.5.2, è necessario usare un serializzatore diverso come System.Runtime.Serialization.DataContractSerializer anziché System.Runtime.Serialization.NetDataContractSerializer. In alternativa, dato che questo problema è stato corretto in .NET Framework 4.6 e possibile risolverlo eseguendo l'aggiornamento a tale versione di .NET Framework.

Nome valore
Scope Secondarie
Versione 4.5.1
Type esecuzione

API interessate

Non rilevabile tramite analisi dell'API.

Il valore AppDomainSetup.DynamicBase non è più generato in modo casuale da UseRandomizedStringHashAlgorithm

Dettagli

Prima di .NET Framework 4.6, il valore di DynamicBase sarebbe stato casuale tra i domini applicazione o tra i processi con l'impostazione UseRandomizedStringHashAlgorithm abilitata nel file di configurazione dell'app. A partire da .NET Framework 4.6, DynamicBase restituirà un risultato stabile tra istanze diverse di un'app in esecuzione e tra domini app diversi. Le basi dinamiche saranno comunque diverse per app differenti. Questa modifica rimuove solo l'elemento di denominazione casuale per le diverse istanze della stessa app.

Suggerimento

Tenere presente che l'abilitazione di UseRandomizedStringHashAlgorithm non comporterà la generazione casuale di DynamicBase. Se è necessaria una base casuale, devono essere prodotta nel codice dell'app invece che tramite questa API.

Nome valore
Scope Edge
Versione 4.6
Type esecuzione

API interessate

La chiamata di Attribute.GetCustomAttributes su una proprietà indicizzatore non genera più AmbiguousMatchException se l'ambiguità può essere risolta dal tipo di indice

Dettagli

Prima di .NET Framework 4.6, la chiamata di GetCustomAttribute(s) su una proprietà indicizzatore diversa da un'altra proprietà solo per il tipo di indice genera una eccezione System.Reflection.AmbiguousMatchException. A partire da .NET Framework 4.6, gli attributi della proprietà verranno restituiti correttamente.

Suggerimento

Tenere presente che GetCustomAttribute funzionerà più frequentemente. Se un'app dipende da System.Reflection.AmbiguousMatchException nelle versioni precedenti, è ora necessario usare la reflection per cercare in modo esplicito più indicizzatori.

Nome valore
Scope Edge
Versione 4.6
Type esecuzione

API interessate

Gli COR_PRF_GC_ROOT_HANDLE non vengono enumerati dai profiler

Dettagli

In .NET Framework 4.5.1, l'API di profilatura RootReferences2() non restituisce mai COR_PRF_GC_ROOT_HANDLE erroneamente (vengono invece restituiti come COR_PRF_GC_ROOT_OTHER). Questo problema è risolto a partire da .NET Framework 4.6.

Suggerimento

Questo problema è stato corretto in .NET Framework 4.6 e può essere risolto eseguendo l'aggiornamento a tale versione di .NET Framework.

Nome valore
Scope Secondarie
Versione 4.5.1
Type esecuzione

API interessate

Non rilevabile tramite analisi dell'API.

Gli EventListener ETW non acquisiscono gli eventi dai provider con parole chiave esplicite (come il provider TPL)

Dettagli

Gli EventListener ETW con una maschera di parole chiave vuota non acquisiscono correttamente gli eventi dai provider con parole chiave esplicite. In .NET Framework 4.5, il provider TPL ha iniziato a fornire parole chiave esplicite e ha causato questo problema. In .NET Framework 4.6, gli EventListener sono stati aggiornati e non presentano più questo problema.

Suggerimento

Per risolvere questo problema, sostituire le chiamate a EnableEvents(EventSource, EventLevel) con chiamate all'overload di EnableEvents che specifica in modo esplicito la maschera "qualsiasi parola chiave" da usare: EnableEvents(eventSource, level, unchecked((EventKeywords)0xFFFFffffFFFFffff)).

In alternativa, questo problema è stato corretto in .NET Framework 4.6 e può essere risolto eseguendo l'aggiornamento a tale versione di .NET Framework.

Nome valore
Scope Edge
Versione 4.5
Type esecuzione

API interessate

Il calendario persiano ora usa l'algoritmo solare Hijri

Dettagli

A partire da .NET Framework 4.6, la classe System.Globalization.PersianCalendar usa l'algoritmo solare Hijri. La conversione di date tra il calendario System.Globalization.PersianCalendar e altri calendari può produrre risultati leggermente diversi a partire da .NET Framework 4.6 per le date precedenti al 1800 o successive al 2023 (calendario gregoriano). Inoltre, PersianCalendar.MinSupportedDateTime è ora March 22, 0622 invece di March 21, 0622.

Suggerimento

Tenere presente che alcune date precedenti o successive potrebbero essere leggermente diverse quando si usa PersianCalendar in .NET Framework 4.6. Inoltre, quando si serializzano le date tra processi che possono essere eseguiti in versioni diverse di .NET Framework, evitare di archiviarle come stringhe di data PersianCalendar, perché tali valori potrebbero essere diversi.

Nome valore
Scope Secondarie
Versione 4.6
Type esecuzione

API interessate

Gli oggetti Reflection non possono essere più passati dal codice gestito ai client DCOM out-of-process

Dettagli

Gli oggetti di reflection non possono essere più passati dal codice gestito ai client DCOM out-of-process. Sono interessati i tipi seguenti:

Le chiamate a IMarshal per l'oggetto restituiscono E_NOINTERFACE.

Suggerimento

Aggiornare il codice di marshalling in modo che funzioni con oggetti non di reflection.

Nome valore
Scope Secondarie
Versione 4.6
Type esecuzione

API interessate

L'impostazione predefinita di TargetFrameworkName per il dominio app predefinito non è più Null, se non impostata

Dettagli

System.AppDomainSetup.TargetFrameworkName era precedentemente Null nel dominio app predefinito, se non impostata in modo esplicito. A partire dalla versione 4.6, la proprietà System.AppDomainSetup.TargetFrameworkName per il dominio app predefinito avrà un valore predefinito derivato da TargetFrameworkAttribute, se presente. I domini app non predefiniti continueranno a ereditare la proprietà System.AppDomainSetup.TargetFrameworkName dal dominio app predefinito (che non avrà per impostazione predefinita il valore Null nella versione 4.6), a meno che non sia sottoposta a override in modo esplicito.

Suggerimento

Il codice deve essere aggiornato in modo che non dipenda dal fatto che l'impostazione predefinita di TargetFrameworkName sia null. Se è necessario che questa proprietà continui a restituire null, è possibile impostarla in modo esplicito su tale valore.

Nome valore
Scope Edge
Versione 4.6
Type esecuzione

API interessate

X509Certificate2.ToString(Boolean) ora non genera un'eccezione quando .NET non è in grado di gestire il certificato

Dettagli

In .NET Framework 4.5.2 e versioni precedenti, questo metodo generava un'eccezione se veniva passato il valore true per il parametro verbose e se erano presenti certificati installati non supportati da .NET Framework. Ora il metodo ha esito positivo e restituisce una stringa valida che omette le parti inaccessibili del certificato.

Suggerimento

È consigliabile aggiornare qualsiasi codice che dipende da X509Certificate2.ToString(Boolean) in modo da prevedere che la stringa restituita possa escludere alcuni dati del certificato, ad esempio la chiave pubblica, la chiave privata e le estensioni, in alcuni casi in cui l'API avrebbe precedentemente generato un'eccezione.

Nome valore
Scope Edge
Versione 4.6
Type esecuzione

API interessate

Dati

Il tentativo di connessione TCP/IP a un database di SQL Server corrispondente a localhost non riesce

Dettagli

In .NET Framework 4.6 e 4.6.1, il tentativo di connessione TCP/IP a un database di SQL Server corrispondente a localhost ha esito negativo con l'errore “Si è verificato un errore di rete o specifico dell'istanza mentre si cercava di stabilire una connessione con SQL Server. Il server non è stato trovato o non è accessibile. Verificare che il nome dell'istanza sia corretto e che il server sia configurato in modo da consentire connessioni remote. (provider: interfacce di rete SQL, errore: 26 - Errore nell'individuazione del server/dell'istanza specificata)"

Suggerimento

Questo problema è stato risolto ed è stato ripristinato il comportamento precedente in .NET Framework 4.6.2. Per connettersi a un database di SQL Server corrispondente a localhost, eseguire l'aggiornamento a .NET Framework 4.6.2.

Nome valore
Scope Secondarie
Versione 4.6
Type esecuzione

API interessate

Non rilevabile tramite analisi dell'API.

Debugger

I valori di unione Null non risultano visibili nel debugger fino al passaggio successivo

Dettagli

A causa di un bug in .NET Framework 4.5, i valori impostati tramite un'operazione di unione Null non sono visibili nel debugger immediatamente dopo l'esecuzione dell'operazione di assegnazione quando si usa la versione a 64 bit del framework.

Suggerimento

L'esecuzione di un ulteriore passo nel debugger determinerà il corretto aggiornamento del valore locale o del valore del campo. Questo problema è stato corretto in .NET Framework 4.6. L'aggiornamento a questa versione del framework dovrebbe quindi risolvere il problema.

Nome valore
Scope Edge
Versione 4.5
Type esecuzione

API interessate

Non rilevabile tramite analisi dell'API.

Rete

ContentDisposition DateTimes restituisce una stringa leggermente diversa

Dettagli

Le rappresentazioni di stringa di System.Net.Mime.ContentDisposition sono state aggiornate, a partire dalla versione 4.6, in modo da rappresentare sempre il componente dell'ora di un valore System.DateTime con due cifre. Questo comportamento è conforme a RFC822 e RFC2822. Ne consegue che ToString() restituisce una stringa leggermente diversa nella versione 4.6 negli scenari in cui uno degli elementi di tempo della disposizione precede le 10.00. Si noti che i valori di ContentDisposition vengono a volte serializzati convertendoli in stringhe, pertanto è necessario verificare qualsiasi operazione ToString(), la serializzazione o le chiamate di GetHashCode.

Suggerimento

Non dare per scontato che le rappresentazioni di stringa di ContentDisposition da versioni diverse di .NET Framework vengano confrontate correttamente. Se possibile, riconvertire le stringhe in ContentDisposition prima di eseguire un confronto.

Nome valore
Scope Secondarie
Versione 4.6
Type esecuzione

API interessate

Serializzazione

Messaggio di eccezione modificato per la serializzazione di DataContract non riuscita in caso di tipo sconosciuto

Dettagli

A partire da .NET Framework 4.6 è stato semplificato il messaggio di eccezione generato se per un oggetto System.Runtime.Serialization.DataContractSerializer o System.Runtime.Serialization.Json.DataContractJsonSerializer non è possibile serializzare o deserializzare perché mancano "tipi noti".

Suggerimento

Le app non devono dipendere da messaggi di eccezione specifici. Se un'app dipende da questo messaggio, aggiornarla in modo che preveda il nuovo messaggio o, preferibilmente, modificarla in modo che dipenda solo dal tipo di eccezione.

Nome valore
Scope Edge
Versione 4.6
Type esecuzione

API interessate

Installazione e distribuzione

Modifiche apportate al controllo delle versioni del prodotto in .NET Framework 4.6 e versioni successive

Dettagli

Il controllo delle versioni del prodotto è cambiato rispetto alle versioni precedenti di .NET Framework, in particolare rispetto a .NET Framework 4, 4.5, 4.5.1 e 4.5.2. Di seguito sono illustrate in modo dettagliato le modifiche:

  • Il valore della voce Version nella chiave HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full è stato modificato in 4.6.xxxxx per .NET Framework 4.6 e versioni intermedie e in 4.7.xxxxx per .NET Framework 4.7 e 4.7.1. In .NET Framework 4.5, 4.5.1 e 4.5.2, il formato era 4.5.xxxxx.
  • Il controllo delle versioni di file e prodotti per i file di .NET Framework è stato modificato dal precedente schema di controllo delle versioni 4.0.30319.x in 4.6.X.0 per .NET Framework 4.6 e versioni intermedie e in 4.7.X.0 per .NET Framework 4.7 e 4.7.1. È possibile visualizzare questi nuovi valori scegliendo Proprietà dopo aver fatto clic con il pulsante destro del mouse su un file.
  • Gli attributi AssemblyFileVersionAttribute e AssemblyInformationalVersionAttribute per gli assembly gestiti presentano valori di versione nel formato 4.6.X.0 per .NET Framework 4.6 e versioni intermedie e 4.7.X.0 per .NET Framework 4.7 e 4.7.1.
  • In .NET Framework 4.6, 4.6.1, 4.6.2, 4.7 e 4.7.1 la proprietà Environment.Version restituisce la stringa di versione fissa 4.0.30319.42000. In .NET Framework 4, 4.5, 4.5.1 e 4.5.2, restituisce le stringhe di versione nel formato 4.0.30319.xxxxx (ad esempio, "4.0.30319.18010"). Si noti che è sconsigliabile che il codice di applicazione acquisisca nuove dipendenze dalla proprietà Environment.Version.

Per altre informazioni, vedere Procedura: Determinare le versioni di .NET Framework installate.

Suggerimento

In generale, le applicazioni dovrebbero dipendere dalle tecniche consigliate per il rilevamento di elementi come la versione di runtime di .NET Framework e la directory di installazione:

  • Per rilevare la versione di runtime di .NET Framework, vedere Procedura: Determinare le versioni di .NET Framework installate.
  • Per determinare il percorso di installazione di .NET Framework, usare il valore della voce InstallPath nella chiave HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full.

Importante

Il nome della sottochiave è NET Framework Setup, non .NET Framework Setup.

  • Per determinare il percorso di directory a Common Language Runtime di .NET Framework, chiamare il metodo RuntimeEnvironment.GetRuntimeDirectory().
  • Per ottenere la versione CLR, chiamare il metodo RuntimeEnvironment.GetSystemVersion(). Per .NET Framework 4 e versioni intermedie (.NET Framework 4.5, 4.5.1, 4.5.2 e .NET Framework 4.6, 4.6.1, 4.6.2, 4.7 e 4.7.1), restituisce la stringa v4.0.30319.
Nome valore
Scope Secondarie
Versione 4.6
Type esecuzione

API interessate

Non rilevabile tramite analisi dell'API.

.NET Framework 4.6 non usa una versione 4.5.x.x durante la registrazione nel Registro di sistema

Dettagli

Come prevedibile, il set di chiavi della versione nel Registro di sistema (in HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\NET Framework Setup\NDP\v4\Full) per .NET Framework 4.6 inizia con "4.6" e non "4.5". Le app che dipendono da queste chiavi del Registro di sistema per conoscere le versioni di .NET Framework installate in un computer devono essere aggiornate in modo da comprendere che 4.6 è una nuova versione possibile che è compatibile con le precedenti versioni 4.5.x.

Suggerimento

Aggiornare le app che sondano un'installazione di .NET Framework 4.5 cercando le chiavi del Registro di sistema 4.5 in modo che accettino anche la versione 4.6.

Nome valore
Scope Edge
Versione 4.6
Type esecuzione

API interessate

Non rilevabile tramite analisi dell'API.

Windows Communication Foundation (WCF)

Servizi WCF che usano NETTCP con sicurezza SSL e autenticazione dei certificati MD5

Dettagli

.NET Framework 4.6 aggiunge TLS 1.1 e TLS 1.2 all'elenco dei protocolli predefiniti SSL WCF. Quando .NET Framework 4.6 o versione successiva è installato sia nei computer client che nei server, per la negoziazione viene usato TLS 1.2, che non supporta l'autenticazione dei certificati MD5. Di conseguenza, se un cliente usa un certificato MD5, il client WCF non riuscirà a connettersi al servizio WCF.

Suggerimento

È possibile risolvere questo problema in modo che un client WCF possa connettersi a un server WCF effettuando una delle operazioni seguenti:

  • Aggiornare il certificato in modo che non usi l'algoritmo MD5. Si tratta della soluzione consigliata.
  • Se l'associazione non è configurata in modo dinamico nel codice sorgente, aggiornare il file di configurazione dell'applicazione in modo che usi TLS 1.1 o una versione precedente del protocollo. In questo modo è possibile continuare a usare un certificato con l'algoritmo hash MD5.

Avviso

Questa soluzione non è consigliata, poiché un certificato con l'algoritmo hash MD5 viene considerato non protetto.

Il file di configurazione seguente permette di effettuare queste operazioni:

<configuration>
  <system.serviceModel>
    <bindings>
      <netTcpBinding>
        <binding>
          <security mode= "None/Transport/Message/TransportWithMessageCredential" >
            <transport clientCredentialType="None/Windows/Certificate"
                       protectionLevel="None/Sign/EncryptAndSign"
                       sslProtocols="Ssl3/Tls1/Tls11">
            </transport>
          </security>
        </binding>
      </netTcpBinding>
    </bindings>
  </system.ServiceModel>
</configuration>

Avviso

Questa soluzione non è consigliata, poiché un certificato con l'algoritmo hash MD5 viene considerato non protetto.

Nome valore
Scope Secondarie
Versione 4.6
Type esecuzione

API interessate

Non rilevabile tramite analisi dell'API.

Windows Presentation Foundation (WPF)

L'accesso agli elementi selezionati di un elemento DataGrid WPF da parte di un gestore dell'evento UnloadingRow di DataGrid può determinare un'eccezione NullReferenceException

Dettagli

A causa di un bug in .NET Framework 4.5, i gestori eventi per gli eventi DataGrid che includono la rimozione di una riga possono originare un'eccezione System.NullReferenceException se accedono alle proprietà System.Windows.Controls.Primitives.Selector.SelectedItem o System.Windows.Controls.Primitives.MultiSelector.SelectedItems di DataGrid.

Suggerimento

Questo problema è stato corretto in .NET Framework 4.6 e può essere risolto eseguendo l'aggiornamento a tale versione di .NET Framework.

Nome valore
Scope Secondarie
Versione 4.5
Type esecuzione

API interessate

La chiamata di Items.Refresh su un controllo WPF ListBox, ListView o DataGrid con elementi selezionati può determinare la visualizzazione di elementi duplicati nell'elemento

Dettagli

In .NET Framework 4.5, la chiamata di ListBox.Items.Refresh dal codice mentre sono presenti elementi selezionati in un controllo System.Windows.Controls.ListBox può causare la duplicazione degli elementi selezionati nell'elenco. Si verifica un problema analogo con System.Windows.Controls.ListView e System.Windows.Controls.DataGrid. Questo problema è risolto in .NET Framework 4.6.

Suggerimento

Questo problema può essere evitato deselezionando gli elementi a livello di codice prima della chiamata di System.Windows.Data.CollectionView.Refresh(), per poi selezionarli di nuovo dopo il completamento della chiamata. In alternativa, questo problema è stato corretto in .NET Framework 4.6 e può essere risolto eseguendo l'aggiornamento a tale versione di .NET Framework.

Valore
Scope Secondarie
Versione 4.5
Type esecuzione

API interessate

CoerceIsSelectionBoxHighlighted

Dettagli

Alcune sequenze di azioni che interessano un System.Windows.Controls.ComboBox e la relativa origine dati possono determinare un'eccezione System.NullReferenceException.

Suggerimento

Se possibile, eseguire l'aggiornamento a .NET Framework 4.6.2.

Nome valore
Scope Secondarie
Versione 4.6
Type esecuzione

API interessate

Problema di associazione ListBoxItem IsSelected con ObservableCollection<T>.Move

Dettagli

La chiamata di Move(Int32, Int32) oppure MoveItem(Int32, Int32) su una raccolta associata a un controllo System.Windows.Controls.ListBox con elementi selezionati può causare un comportamento imprevedibile per la selezione futura o la deselezione di elementi System.Windows.Controls.ListBox.

Suggerimento

La chiamata di System.Collections.ObjectModel.Collection<T>.Remove(T) e System.Collections.ObjectModel.Collection<T>.Insert(Int32, T) invece di Move(Int32, Int32) risolverà questo problema. In alternativa, questo problema è stato corretto in .NET Framework 4.6 e può essere risolto eseguendo l'aggiornamento a tale versione di .NET Framework.

Nome valore
Scope Secondarie
Versione 4.5
Type esecuzione

API interessate

Un clic con il pulsante destro del mouse su un'intestazione DataGrid WPF modifica la selezione DataGrid

Dettagli

Facendo clic con il pulsante destro del mouse su un'intestazione riga System.Windows.Controls.DataGrid selezionata mentre sono selezionate più righe, la selezione di System.Windows.Controls.DataGrid diventa la selezione esclusiva della riga.

Suggerimento

Questo problema è stato corretto in .NET Framework 4.6 e può essere risolto eseguendo l'aggiornamento a tale versione di .NET Framework.

Nome valore
Scope Edge
Versione 4.5
Type esecuzione

API interessate

WPF genera un processo wisptis.exe che può bloccare il puntatore del mouse

Dettagli

Un problema nella versione 4.5.2 genera un processo wisptis.exe che può bloccare l'input del mouse.

Suggerimento

Una correzione per questo problema è disponibile in una Service Release di .NET Framework 4.5.2 (hotfix rollup 3026376) o eseguendo l'aggiornamento a .NET Framework 4.6

Nome valore
Scope Major
Versione 4.5.2
Type esecuzione

API interessate

Non rilevabile tramite analisi dell'API.

Il controllo ortografico WPF nei controlli con supporto di testo non funziona in Windows 10 per le lingue non incluse nell'elenco lingue di input del sistema operativo

Dettagli

Durante l'esecuzione in Windows 10, il controllo ortografico potrebbe non funzionare per i controlli WPF basati su testo perché le funzionalità di controllo ortografico della piattaforma sono disponibili solo per le lingue presenti nell'elenco delle lingue di input. In Windows 10, quando una lingua viene aggiunta all'elenco di tastiere disponibili, Windows scarica e installa automaticamente una funzione corrispondente nel pacchetto di funzionalità su richiesta (FOD, Feature on Demand) che offre funzionalità di controllo ortografico. Aggiungendo la lingua all'elenco di lingue di input, il controllo ortografico sarà supportato.

Suggerimento

Tenere presente che per il funzionamento del controllo ortografico in Windows 10 è necessario aggiungere la lingua o il testo da sottoporre a controllo come lingua di input.

Nome valore
Scope Edge
Versione 4.6
Type esecuzione

API interessate

Non rilevabile tramite analisi dell'API.

Il rendering delle finestre WPF viene eseguito senza ritaglio quando le finestre si estendono oltre un singolo monitor

Dettagli

In .NET Framework 4.6 in esecuzione su Windows 8 e versioni successive viene eseguito il rendering dell'intera finestra senza ritaglio quando la finestra si estende al di fuori di un singolo schermo in uno scenario d'uso di più monitor. Questo comportamento è diverso rispetto a quello delle versioni precedenti di .NET Framework in cui le finestre WPF che si estendevano oltre un singolo schermo venivano ritagliate.

Suggerimento

Questo funzionamento (applicazione o non applicazione del ritaglio) può essere impostato esplicitamente tramite l'elemento <EnableMultiMonitorDisplayClipping> in <appSettings> nel file di configurazione di un'applicazione oppure impostando la proprietà EnableMultiMonitorDisplayClipping all'avvio dell'app.

Nome valore
Scope Secondarie
Versione 4.6
Type esecuzione

API interessate

Non rilevabile tramite analisi dell'API.

.NET Framework 4.6.1

Strumenti

Contract.Invariant o Contract.Requires<TException> non considera String.IsNullOrEmpty come puro

Dettagli

Per le app destinate a .NET Framework 4.6.1, se il contratto invariante per Contract.Invariant o il contratto di precondizione per Requires chiama il metodo String.IsNullOrEmpty, il rewriter emette l'avviso del compilatore CC1036: “Detected call to method 'System.String.IsNullOrWhiteSpace(System.String)' without [Pure] in method.” (Rilevata chiamata al metodo 'System.String.IsNullOrWhiteSpace(System.String)' senza [Pure] nel metodo). Si tratta di un avviso del compilatore, non di un errore del compilatore.

Suggerimento

Questo comportamento è stato affrontato nel problema GitHub n. 339. Per eliminare questo avviso, è possibile scaricare e compilare una versione aggiornata del codice sorgente per lo strumento Contratti di codice da GitHub. Le informazioni per il download sono disponibili in fondo alla pagina.

Nome valore
Scope Secondarie
Versione 4.6.1
Type esecuzione

API interessate

Windows Presentation Foundation (WPF)

Scorrimento per elementi in un elenco semplice con elementi la cui altezza in pixel è diversa

Dettagli

Quando System.Windows.Controls.ItemsControl visualizza una raccolta mediante la virtualizzazione (IsVirtualizing=true) e lo scorrimento per elementi (ScrollUnit=Item) e quando si scorre il controllo per visualizzare un elemento la cui altezza in pixel è diversa dagli elementi adiacenti, System.Windows.Controls.VirtualizingStackPanel esegue l'iterazione in tutti gli elementi nella raccolta. L'interfaccia utente non risponde durante questa iterazione. L'iterazione si verifica in altre circostanze, anche nelle versioni precedenti di .NET Framework. Si verifica, ad esempio, quando lo scorrimento pixel (ScrollUnit=Pixel) incontra un elemento con un'altezza di pixel diversa e quando lo scorrimento per elementi di dati gerarchici (ad esempio in System.Windows.Controls.TreeView o in System.Windows.Controls.ItemsControl con raggruppamento abilitato) incontra un elemento con un numero diverso di elementi discendenti rispetto agli elementi adiacenti. Nel caso dello scorrimento per elementi e le altezze di pixel diverse, in .NET Framework 4.6.1 è stata introdotta l'iterazione per correggere i bug nel layout dei dati gerarchici. Non è necessaria se i dati sono flat (senza gerarchia) e .NET Framework 4.6.2 non la esegue in questo caso.

Suggerimento

Se l'iterazione avviene in .NET Framework 4.6.1 ma non nelle versioni precedenti, ovvero se System.Windows.Controls.ItemsControl esegue lo scorrimento per elementi di un elenco semplice con elementi con altezze diverse in pixel, esistono due soluzioni:

  • Installare .NET Framework 4.6.2.
  • Installare l'hotfix HR 1605 per .NET Framework 4.6.1.
Nome valore
Scope Secondarie
Versione 4.6.1
Type esecuzione

API interessate

ObjectDisposedException generata dal controllo ortografico WPF

Dettagli

Può verificarsi l'arresto anomalo di applicazioni WPF con un System.ObjectDisposedException generato dal controllo ortografico. Questo problema è risolto in .NET Framework 4.7 WPF, dove l'eccezione viene gestita in modo normale e pertanto si evitano effetti avversi sulle applicazioni. Si noti che potranno essere rilevate eccezioni first-chance occasionali nelle applicazioni in esecuzione in un debugger.

Suggerimento

Effettuare l'aggiornamento a .NET Framework 4.7

Nome valore
Scope Edge
Versione 4.6.1
Type esecuzione

API interessate

Non rilevabile tramite analisi dell'API.

Il controllo ortografico in WPF restituisce errori imprevisti

Dettagli

Questa condizione riunisce vari problemi riscontrati con il controllo ortografico WPF:

  • In determinati casi il controllo ortografico WPF genera System.Runtime.InteropServices.COMException
  • Il controllo ortografico WPF non riesce con UnauthorizedAccessException quando le applicazioni vengono avviate usando "Esegui come altro utente"
  • Il controllo ortografico WPF identifica in modo errato gli errori di ortografia di parole composte, ad esempio "Hausnummer" in tedesco.

Suggerimento

Problema n. 1: risolto in .NET Framework 4.6.2. Problema n. 2: il controllo ortografico WPF non è più supportato quando le applicazioni vengono avviate usando l'opzione "Esegui come altro utente". A partire da .NET Framework 4.6.2, le applicazioni avviate in questo modo non si arrestano più in modo anomalo, ma il controllo ortografico viene disabilitato automaticamente. Problema n. 3: risolto in .NET Framework 4.6.2.

Nome valore
Scope Edge
Versione 4.6.1
Type esecuzione

API interessate

Non rilevabile tramite analisi dell'API.

.NET Framework 4.6.2

Dati

Il tentativo di connessione TCP/IP a un database di SQL Server corrispondente a localhost non riesce

Dettagli

In .NET Framework 4.6 e 4.6.1, il tentativo di connessione TCP/IP a un database di SQL Server corrispondente a localhost ha esito negativo con l'errore “Si è verificato un errore di rete o specifico dell'istanza mentre si cercava di stabilire una connessione con SQL Server. Il server non è stato trovato o non è accessibile. Verificare che il nome dell'istanza sia corretto e che il server sia configurato in modo da consentire connessioni remote. (provider: interfacce di rete SQL, errore: 26 - Errore nell'individuazione del server/dell'istanza specificata)"

Suggerimento

Questo problema è stato risolto ed è stato ripristinato il comportamento precedente in .NET Framework 4.6.2. Per connettersi a un database di SQL Server corrispondente a localhost, eseguire l'aggiornamento a .NET Framework 4.6.2.

Nome valore
Scope Secondarie
Versione 4.6
Type esecuzione

API interessate

Non rilevabile tramite analisi dell'API.

Il periodo di blocco del pool di connessioni per i database SQL di Azure è stato rimosso

Dettagli

A partire da .NET Framework 4.6.2, in caso di richieste di apertura connessioni a database SQL di Azure noti (*.database.windows.net, *.database.chinacloudapi.cn, *.database.usgovcloudapi.net, *.database.cloudapi.de), il periodo di blocco del pool di connessioni viene rimosso ed eventuali errori di apertura connessioni non vengono memorizzati nella cache. Dopo gli errori di connessione del transiente, verranno effettuati tentativi quasi istantanei per ripetere le richieste di connessione aperte. Questa modifica consente di ritentare immediatamente l'apertura di una connessione ai database SQL di Azure, migliorando così le prestazioni delle app abilitate per il cloud. Per tutti gli altri tentativi di connessione continua a essere applicato il periodo di blocco del pool di connessioni.

In .NET Framework 4.6.1 e versioni precedenti, se un'applicazione rileva un errore di connessione temporanea mentre si connette a un database, non è possibile ritentare subito la connessione, perché il pool di connessioni memorizza l'errore nella cache e lo rigenera per un periodo compreso tra 5 secondi e 1 minuto. Per altre informazioni, vedere Pool di connessioni SQL Server (ADO.NET). Questo comportamento può causare problemi con le connessioni a database SQL di Azure, che spesso hanno esito negativo in caso di errori temporanei che vengono generalmente ripristinati nell'arco di pochi secondi. Con la funzionalità di blocco del pool di connessioni, l'app non può connettersi al database per un periodo esteso, anche se il database è disponibile e il rendering dell'app deve essere eseguito entro pochi secondi.

Suggerimento

Se questo comportamento non è auspicabile, il periodo di blocco del pool di connessioni può essere configurato impostando la proprietà System.Data.SqlClient.SqlConnectionStringBuilder.PoolBlockingPeriod introdotta in .NET Framework 4.6.2. Il valore della proprietà è un membro dell'enumerazione System.Data.SqlClient.PoolBlockingPeriod che può assumere uno dei tre valori seguenti:

È possibile ripristinare il comportamento precedente impostando la proprietà System.Data.SqlClient.SqlConnectionStringBuilder.PoolBlockingPeriod su AlwaysBlock.

Nome valore
Scope Secondarie
Versione 4.6.2
Type esecuzione

API interessate

Globalizzazione

Le categorie dello standard Unicode versione 8.0 sono ora supportate

Dettagli

In .NET Framework 4.6.2 i dati Unicode sono stati aggiornati dallo standard Unicode versione 6.3 alla versione 8.0. Quando si richiedono le categorie di caratteri Unicode in .NET Framework 4.6.2, alcuni risultati potrebbero non corrispondere ai risultati ottenuti nelle versioni precedenti di .NET Framework. Questa modifica interessa principalmente le sillabe Cherokee e i simboli delle vocali e dei toni di Tai Lue semplificato.

Suggerimento

Esaminare il codice e rimuovere o modificare la logica che dipende dalle categorie di caratteri Unicode hardcoded.

Nome valore
Scope Secondarie
Versione 4.6.2
Type esecuzione

API interessate

Sicurezza

RSACng e DSACng possono essere di nuovo usati in scenari di attendibilità parziale

Dettagli

In alcuni casi, CngLightup (usato in diverse API di crittografia di livello superiore, ad esempio System.Security.Cryptography.Xml.EncryptedXml) e System.Security.Cryptography.RSACng si basano sull'attendibilità totale. Questi casi includono i P/Invoke senza l'asserzione delle autorizzazioni SecurityPermissionFlag.UnmanagedCode e i percorsi di codice in cui System.Security.Cryptography.CngKey include richieste di autorizzazione per SecurityPermissionFlag.UnmanagedCode. A partire da .NET Framework 4.6.2, CngLightup viene usato per passare a System.Security.Cryptography.RSACng, quando possibile. Di conseguenza, le app con attendibilità parziale che usano System.Security.Cryptography.Xml.EncryptedXml hanno iniziato a restituire errori e a generare eccezioni SecurityException. Questa modifica aggiunge le asserzioni necessarie in modo che tutte le funzioni che usano CngLightup abbiano le autorizzazioni richieste.

Suggerimento

Se questa modifica apportata in .NET Framework 4.6.2 ha avuto un impatto negativo sulle app con attendibilità parziale, eseguire l'aggiornamento a .NET Framework 4.7.1.

Nome valore
Scope Edge
Versione 4.6.2
Type esecuzione

API interessate

RSACng.VerifyHash ora restituisce False per qualsiasi errore di verifica

Dettagli

A partire da .NET Framework 4.6.2, questo metodo restituisce False se la firma stessa non è formattata correttamente. Ora restituisce false per qualsiasi errore di verifica. In .NET Framework 4.6 e 4.6.1, il metodo genera System.Security.Cryptography.CryptographicException se non è formattata correttamente la firma stessa.

Suggerimento

Qualsiasi codice la cui esecuzione dipenda da System.Security.Cryptography.CryptographicException deve invece essere eseguito se la convalida non va a buon fine e il metodo restituisce False.

Nome valore
Scope Secondarie
Versione 4.6.2
Type esecuzione

API interessate

Modifiche di SignedXml ed EncryptedXml che causano interruzioni

Dettagli

In .NET Framework 4.6.2, le correzioni per la sicurezza in System.Security.Cryptography.Xml.SignedXml e System.Security.Cryptography.Xml.EncryptedXml causano comportamenti diversi in fase di esecuzione. Ad esempio:

  • se per un documento esistono più elementi con lo stesso attributo id e una firma fa riferimento a uno di tali elementi come radice della firma, il documento ora verrà considerato non valido.
  • I documenti che usano algoritmi di trasformazione XPath non canonici nei riferimenti ora vengono considerati non validi.
  • I documenti che usano algoritmi di trasformazione XSLT non canonici nei riferimenti ora vengono considerati non validi.
  • Eventuali programmi che usano firme di risorse esterne scollegate non saranno in grado di eseguire questa operazione.

Suggerimento

Gli sviluppatori devono esaminare l'uso di XmlDsigXsltTransform e XmlDsigXsltTransform nonché dei tipi derivati da Transform, poiché un destinatario del documento potrebbe non essere in grado di elaborarlo.

Nome valore
Scope Secondarie
Versione 4.6.2
Type esecuzione

API interessate

Windows Communication Foundation (WCF)

Rimuovere Ssl3 da TransportDefaults in WCF

Dettagli

Quando si usa NetTcp con la sicurezza del trasporto e un tipo di certificato con credenziali, il protocollo SSL 3 non è più un protocollo predefinito usato per negoziare una connessione protetta. Nella maggior parte dei casi non vi sarà alcun impatto sulle applicazioni esistenti, poiché TLS 1.0 è sempre stato incluso nell'elenco di protocolli per NetTcp. Tutti i client esistenti devono essere in grado di negoziare una connessione usando almeno TLS1.0.

Suggerimento

Se è necessario il protocollo Ssl3, usare uno dei meccanismi di configurazione seguenti per aggiungere SsI3 all'elenco dei protocolli negoziati.

Nome valore
Scope Edge
Versione 4.6.2
Type esecuzione

API interessate

Windows Presentation Foundation (WPF)

La modifica della proprietà IsEnabled dell'elemento padre di un controllo TextBlock influisce sui controlli figlio

Dettagli

A partire da .NET Framework 4.6.2, la modifica della proprietà System.Windows.UIElement.IsEnabled dell'elemento padre di un controllo System.Windows.Controls.TextBlock influisce sui controlli figlio, ad esempio collegamenti ipertestuali e pulsanti, del controllo System.Windows.Controls.TextBlock. In .NET Framework 4.6.1 e versioni precedenti i controlli all'interno di System.Windows.Controls.TextBlock non sempre riflettono lo stato della proprietà System.Windows.UIElement.IsEnabled dell'elemento padre System.Windows.Controls.TextBlock.

Suggerimento

Nessuno. Questa modifica è conforme al comportamento previsto per i controlli all'interno di un controllo System.Windows.Controls.TextBlock.

Nome valore
Scope Secondarie
Versione 4.6.2
Type esecuzione

API interessate

CoerceIsSelectionBoxHighlighted

Dettagli

Alcune sequenze di azioni che interessano un System.Windows.Controls.ComboBox e la relativa origine dati possono determinare un'eccezione System.NullReferenceException.

Suggerimento

Se possibile, eseguire l'aggiornamento a .NET Framework 4.6.2.

Nome valore
Scope Secondarie
Versione 4.6
Type esecuzione

API interessate

DataGridCellsPanel.BringIndexIntoView genera ArgumentOutOfRangeException

Dettagli

ScrollIntoView(Object) funziona in modo asincrono quando è abilitata la virtualizzazione delle colonne la cui larghezza tuttavia non è stata ancora determinata. Se le colonne vengono rimosse prima dell'operazione asincrona, può verificarsi un evento System.ArgumentOutOfRangeException.

Suggerimento

Una delle operazioni seguenti:

  • Effettuare l'aggiornamento a .NET Framework 4.7.
  • Installare la patch più recente per la manutenzione di .NET Framework 4.6.2.
  • Evitare di rimuovere colonne fino al completamento della risposta asincrona a ScrollIntoView(Object).
Nome valore
Scope Edge
Versione 4.6.2
Type esecuzione

API interessate

Scorrimento orizzontale e virtualizzazione

Dettagli

Questa modifica si applica a un elemento System.Windows.Controls.ItemsControl che esegue la propria virtualizzazione in direzione ortogonale alla direzione di scorrimento principale (l'esempio principale è System.Windows.Controls.DataGrid con EnableColumnVirtualization="True"). Il risultato di determinate operazioni di scorrimento orizzontale è stato modificato per produrre risultati più intuitivi e simili ai risultati delle operazioni verticali confrontabili.

Le operazioni includono "Scorri fino a qui" e "Margine destro", per usare i nomi del menu visualizzato facendo clic con il pulsante destro del mouse su una barra di scorrimento orizzontale. Entrambe le operazioni calcolano un offset candidato ed eseguono una chiamata a SetHorizontalOffset(Double).

Dopo lo scorrimento al nuovo offset, la definizione di "qui" o "margine destro" potrebbe essere stata modificata, poiché il contenuto appena devirtualizzato ha modificato il valore di System.Windows.Controls.Primitives.IScrollInfo.ExtentWidth.

Nelle versioni precedenti a .NET Framework 4.6.2, l'operazione di scorrimento usa semplicemente l'offset candidato, anche se potrebbe non corrispondere più a "qui" o a "margine destro". Ciò potrebbe risultare in effetti quali il "rimbalzo" dello scorrimento, come illustrato nell'esempio. Si supponga che System.Windows.Controls.DataGrid abbia ExtentWidth = 1000 e Width = 200. Uno scorrimento al "Bordo destro" usa l'offset candidato 1000-200 = 800. Durante lo scorrimento all'offset, le nuove colonne vengono devirtualizzate. Si supponga che siano molto ampie, in modo che System.Windows.Controls.Primitives.IScrollInfo.ExtentWidth venga portato a 2000. Lo scorrimento termina con HorizontalOffset=800 e il controllo "rimbalza" vicino al centro della barra di scorrimento, esattamente in corrispondenza di 800/2000 = 40%.

La modifica consiste nel ricalcolare un nuovo offset candidato quando si verifica questa situazione e quindi nell'eseguire un nuovo tentativo. (Lo scorrimento verticale funziona già in questo modo.)

La modifica produce un'esperienza più prevedibile e intuitiva per l'utente finale, ma può influire anche su qualsiasi applicazione che dipende dal valore esatto di System.Windows.Controls.Primitives.IScrollInfo.HorizontalOffset dopo una operazione di scorrimento orizzontale, attivata dall'utente finale o da una chiamata esplicita a SetHorizontalOffset(Double).

Suggerimento

Un'app che usa un valore stimato per System.Windows.Controls.Primitives.IScrollInfo.HorizontalOffset dovrebbe essere modificata per recuperare il valore effettivo (e il valore di System.Windows.Controls.Primitives.IScrollInfo.ExtentWidth) dopo qualsiasi scorrimento orizzontale in grado di modificare System.Windows.Controls.Primitives.IScrollInfo.ExtentWidth a causa della devirtualizzazione.

Nome valore
Scope Secondarie
Versione 4.6.2
Type esecuzione

API interessate

Items.Clear non rimuove i duplicati da SelectedItems

Dettagli

Se un selettore con selezione multipla abilitata contiene duplicati nella raccolta System.Windows.Controls.Primitives.MultiSelector.SelectedItems, lo stesso elemento viene visualizzato più volte. L'eliminazione di questi elementi dall'origine dati (ad esempio, chiamando Items.Clear) non li rimuove da System.Windows.Controls.Primitives.MultiSelector.SelectedItems; viene rimossa solo la prima istanza. Nell'uso successivo di System.Windows.Controls.Primitives.MultiSelector.SelectedItems, ad esempio SelectedItems.Clear(), si possono inoltre verificare errori, ad esempio System.ArgumentException, in quanto System.Windows.Controls.Primitives.MultiSelector.SelectedItems contiene elementi che non sono più nell'origine dati.

Suggerimento

Se possibile, eseguire l'aggiornamento a .NET Framework 4.6.2.

Nome valore
Scope Secondarie
Versione 4.5
Type esecuzione

API interessate

Scorrimento per elementi in un elenco semplice con elementi la cui altezza in pixel è diversa

Dettagli

Quando System.Windows.Controls.ItemsControl visualizza una raccolta mediante la virtualizzazione (IsVirtualizing=true) e lo scorrimento per elementi (ScrollUnit=Item) e quando si scorre il controllo per visualizzare un elemento la cui altezza in pixel è diversa dagli elementi adiacenti, System.Windows.Controls.VirtualizingStackPanel esegue l'iterazione in tutti gli elementi nella raccolta. L'interfaccia utente non risponde durante questa iterazione. L'iterazione si verifica in altre circostanze, anche nelle versioni precedenti di .NET Framework. Si verifica, ad esempio, quando lo scorrimento pixel (ScrollUnit=Pixel) incontra un elemento con un'altezza di pixel diversa e quando lo scorrimento per elementi di dati gerarchici (ad esempio in System.Windows.Controls.TreeView o in System.Windows.Controls.ItemsControl con raggruppamento abilitato) incontra un elemento con un numero diverso di elementi discendenti rispetto agli elementi adiacenti. Nel caso dello scorrimento per elementi e le altezze di pixel diverse, in .NET Framework 4.6.1 è stata introdotta l'iterazione per correggere i bug nel layout dei dati gerarchici. Non è necessaria se i dati sono flat (senza gerarchia) e .NET Framework 4.6.2 non la esegue in questo caso.

Suggerimento

Se l'iterazione avviene in .NET Framework 4.6.1 ma non nelle versioni precedenti, ovvero se System.Windows.Controls.ItemsControl esegue lo scorrimento per elementi di un elenco semplice con elementi con altezze diverse in pixel, esistono due soluzioni:

  • Installare .NET Framework 4.6.2.
  • Installare l'hotfix HR 1605 per .NET Framework 4.6.1.
Nome valore
Scope Secondarie
Versione 4.6.1
Type esecuzione

API interessate

Viene impostato lo sfondo trasparente per RibbonGroup nelle build localizzate

Dettagli

Lo sfondo di System.Windows.Controls.Ribbon.RibbonGroup nelle build localizzate viene sempre disegnato con il pennello trasparente, causando un'esperienza insoddisfacente per l'interfaccia utente. Questo problema è stato risolto nella correzione di WPF per .NET Framework 4.7 con l'aggiornamento delle risorse localizzate per System.Windows.Controls.Ribbon.RibbonGroup, che a sua volta garantisce che sia selezionato il pennello corretto.

Suggerimento

Effettuare l'aggiornamento a .NET Framework 4.7

Nome valore
Scope Edge
Versione 4.6.2
Type esecuzione

API interessate

Non rilevabile tramite analisi dell'API.

Il controllo ortografico in WPF restituisce errori imprevisti

Dettagli

Questa condizione riunisce vari problemi riscontrati con il controllo ortografico WPF:

  • In determinati casi il controllo ortografico WPF genera System.Runtime.InteropServices.COMException
  • Il controllo ortografico WPF non riesce con UnauthorizedAccessException quando le applicazioni vengono avviate usando "Esegui come altro utente"
  • Il controllo ortografico WPF identifica in modo errato gli errori di ortografia di parole composte, ad esempio "Hausnummer" in tedesco.

Suggerimento

Problema n. 1: risolto in .NET Framework 4.6.2. Problema n. 2: il controllo ortografico WPF non è più supportato quando le applicazioni vengono avviate usando l'opzione "Esegui come altro utente". A partire da .NET Framework 4.6.2, le applicazioni avviate in questo modo non si arrestano più in modo anomalo, ma il controllo ortografico viene disabilitato automaticamente. Problema n. 3: risolto in .NET Framework 4.6.2.

Nome valore
Scope Edge
Versione 4.6.1
Type esecuzione

API interessate

Non rilevabile tramite analisi dell'API.