Leggere in inglese

Condividi tramite


Modifiche di rilievo per la migrazione da .NET Framework a .NET Core

Se si esegue la migrazione di un'app da .NET Framework a .NET Core versioni da 1.0 a 3.1, le modifiche di rilievo elencate in questo articolo potrebbero influire sull'utente. Le modifiche di rilievo vengono raggruppate per categoria e all'interno di tali categorie, in base alla versione di .NET Core in cui sono state introdotte.

Nota

Questo articolo non è un elenco completo delle modifiche di rilievo tra .NET Framework e .NET Core. Le modifiche di rilievo più importanti vengono aggiunte qui man mano che vengono rese note.

Librerie .NET Core

.NET 8

L'API IDispatchImplAttribute viene rimossa

.NET Core 2.1

Modificare il valore predefinito di UseShellExecute

ProcessStartInfo.UseShellExecute ha un valore predefinito di false in .NET Core. In .NET Framework il valore predefinito è true.

Modificare la descrizione

Process.Start consente di avviare direttamente un'applicazione, ad esempio con codice come Process.Start("mspaint.exe") che avvia Paint. Consente anche di avviare indirettamente un'applicazione associata se ProcessStartInfo.UseShellExecute è impostato su true. In .NET Framework, il valore predefinito per ProcessStartInfo.UseShellExecute è true, ovvero il codice come Process.Start("mytextfile.txt") avvierebbe Blocco Note, se fossero stati associati file .txt a tale editor. Per impedire l'avvio indiretto di un'app in .NET Framework, è necessario impostare in modo esplicito ProcessStartInfo.UseShellExecute su false. In .NET Core il valore predefinito per ProcessStartInfo.UseShellExecute è false. Ciò significa che, per impostazione predefinita, le applicazioni associate non vengono avviate quando si chiama Process.Start.

Le proprietà seguenti in System.Diagnostics.ProcessStartInfo sono funzionali solo quando ProcessStartInfo.UseShellExecute è true:

Questa modifica è stata introdotta in .NET Core per motivi di prestazioni. In genere, Process.Start viene usato per avviare direttamente un'applicazione. L'avvio diretto di un'app non deve coinvolgere la shell di Windows e comportare il costo delle prestazioni associato. Per velocizzare questo caso predefinito, .NET Core modifica il valore predefinito di ProcessStartInfo.UseShellExecute in false. Se necessario, è possibile acconsentire esplicitamente al percorso più lento.

Versione introdotta

2.1

Nota

Nelle versioni precedenti di .NET Core UseShellExecute non è stato implementato per Windows.

Se la tua app si basa sul comportamento precedente, chiama Process.Start(ProcessStartInfo) con UseShellExecute impostato su true sull'oggetto ProcessStartInfo.

Categoria

Librerie .NET Core

API interessate


.NET Core 1.0

UnauthorizedAccessException lanciata da FileSystemInfo.Attributes

In .NET Core viene generata una UnauthorizedAccessException quando il chiamante tenta di impostare un valore di attributo di file ma non dispone dell'autorizzazione di scrittura.

Modificare la descrizione

In .NET Framework viene generata una ArgumentException quando il chiamante tenta di impostare un valore dell'attributo di file in FileSystemInfo.Attributes ma non dispone dell'autorizzazione di scrittura. In .NET Core viene invece generata una UnauthorizedAccessException. In .NET Core un ArgumentException viene comunque generato se il chiamante tenta di impostare un attributo di file non valido.

Versione introdotta

1.0

Azione consigliata

Modificare qualsiasi istruzione catch in modo che intercetti un UnauthorizedAccessException invece di un ArgumentExceptiono, se necessario, in aggiunta a un ArgumentException.

Categoria

Librerie .NET Core

API interessate


La gestione delle eccezioni di stato corrotto non è supportata

La gestione delle eccezioni con stato danneggiato del processo in .NET Core non è supportata.

Modificare la descrizione

In precedenza, le eccezioni di stato danneggiato-processo potrebbero essere rilevate e gestite dai gestori di eccezioni del codice gestito, ad esempio usando un'istruzione try-catch in C#.

A partire da .NET Core 1.0, le eccezioni dello stato del processo danneggiato non possono essere gestite dal codice gestito. Il Common Language Runtime non recapita al codice gestito le eccezioni dello stato del processo corrotto.

Versione introdotta

1.0

Azione consigliata

Evitare la necessità di gestire le eccezioni di stato di processo danneggiato affrontando invece le situazioni che le causano. Se è assolutamente necessario gestire eccezioni dello stato del processo danneggiato, scrivere il gestore di eccezioni nel codice C o C++.

Categoria

Librerie .NET Core

API interessate


Le proprietà di UriBuilder non aggiungono più caratteri iniziali

UriBuilder.Fragment non antepone più un carattere iniziale # e UriBuilder.Query non antepone più un carattere iniziale ? quando un tale carattere è già presente.

Modificare la descrizione

In .NET Framework, le proprietà UriBuilder.Fragment e UriBuilder.Query anteponevano sempre rispettivamente un carattere # o ? al valore archiviato. Questo comportamento può comportare la presenza di più caratteri # o ? nel valore archiviato, se la stringa contiene già uno di questi caratteri all'inizio. Ad esempio, il valore di UriBuilder.Fragment potrebbe diventare ##main.

A partire da .NET Core 1.0, queste proprietà non anteponono più i caratteri # o ? al valore archiviato se ne è già presente uno all'inizio della stringa.

Versione introdotta

1.0

Azione consigliata

Non è più necessario rimuovere in modo esplicito uno di questi caratteri iniziali quando si impostano i valori delle proprietà. Ciò è particolarmente utile quando si aggiungono valori, perché non è più necessario rimuovere il # iniziale o ? ogni volta che si aggiunge.

Ad esempio, il frammento di codice seguente mostra la differenza di comportamento tra .NET Framework e .NET Core.

var builder = new UriBuilder();
builder.Query = "one=1";
builder.Query += "&two=2";
builder.Query += "&three=3";
builder.Query += "&four=4";

Console.WriteLine(builder.Query);
  • In .NET Framework l'output è ????one=1&two=2&three=3&four=4.
  • In .NET Core l'output è ?one=1&two=2&three=3&four=4.

Categoria

Librerie .NET Core

API interessate


Process.StartInfo genera InvalidOperationException per i processi non avviati

La lettura della proprietà Process.StartInfo per i processi che il tuo codice non ha avviato genera un InvalidOperationException.

Modificare la descrizione

In .NET Framework, l'accesso alla proprietà Process.StartInfo per i processi che il codice non ha avviato restituisce un oggetto fittizio ProcessStartInfo. L'oggetto fittizio contiene valori predefiniti per tutte le relative proprietà, ad eccezione di EnvironmentVariables.

A partire da .NET Core 1.0, se si legge la proprietà Process.StartInfo per un processo che non è stato avviato (ovvero chiamando Process.Start), viene generata una InvalidOperationException.

Versione introdotta

1.0

Azione consigliata

Non accedere alla proprietà Process.StartInfo per i processi non avviati dal codice. Ad esempio, non leggere questa proprietà per i processi restituiti da Process.GetProcesses.

Categoria

Librerie .NET Core

API interessate


Crittografia

.NET Core 2.1

Il parametro booleano di SignedCms.ComputeSignature è rispettato

In .NET Core viene rispettato il parametro booleano silent del metodo SignedCms.ComputeSignature(CmsSigner, Boolean). Un prompt del PIN non viene visualizzato se questo parametro è impostato su true.

Modificare la descrizione

In .NET Framework il parametro silent del metodo SignedCms.ComputeSignature(CmsSigner, Boolean) viene ignorato e viene sempre visualizzato un prompt del PIN, se richiesto dal provider. In .NET Core il parametro silent viene rispettato e, se impostato su true, non viene mai visualizzato un prompt del PIN, anche se richiesto dal provider.

Il supporto per i messaggi CMS/PKCS #7 è stato introdotto in .NET Core nella versione 2.1.

Versione introdotta

2.1

Azione consigliata

Per assicurarsi che, se necessario, venga visualizzata una richiesta di PIN, le applicazioni desktop devono chiamare SignedCms.ComputeSignature(CmsSigner, Boolean) e impostare il parametro booleano su false. Il comportamento risultante è uguale a in .NET Framework indipendentemente dal fatto che il contesto invisibile all'utente sia disabilitato.

Categoria

Crittografia

Le API interessate


MSBuild

.NET Core 3.0

Modifica del nome del file manifest della risorsa

A partire da .NET Core 3.0, nel caso predefinito, MSBuild genera un nome di file manifesto diverso per i file di risorse.

Versione introdotta

3.0

Modificare la descrizione

Prima di .NET Core 3.0, se non venivano specificati alcun LogicalName, ManifestResourceNameo DependentUpon nei metadati per un elemento EmbeddedResource nel file di progetto, MSBuild generava un nome di file manifesto nel modello <RootNamespace>.<ResourceFilePathFromProjectRoot>.resources. Se RootNamespace non è definito nel file di progetto, per impostazione predefinita viene impostato sul nome del progetto. Ad esempio, il nome manifesto generato per un file di risorse denominato Form1.resx nella directory del progetto radice è stato MyProject.Form1.resources.

A partire da .NET Core 3.0, se un file di risorse è colocalizzato con un file di origine con lo stesso nome (ad esempio, Form1.resx e Form1.cs), MSBuild utilizza le informazioni sul tipo di dato dal file di origine per generare il nome del file manifesto nel modello <Namespace>.<ClassName>.resources. Lo spazio dei nomi e il nome della classe vengono estratti dal primo tipo nel file di origine colocato. Ad esempio, il nome manifesto generato per un file di risorse denominato Form1.resx che è colocato con un file di origine denominato Form1.cs è MyNamespace.Form1.resources. L'aspetto principale da notare è che la prima parte del nome file è diversa dalle versioni precedenti di .NET Core (MyNamespace anziché MyProject).

Nota

Se sono presenti LogicalName, ManifestResourceNameo DependentUpon metadati specificati in un elemento EmbeddedResource nel file di progetto, questa modifica non influisce sul file di risorse.

Questa modifica di rilievo è stata introdotta con l'aggiunta della proprietà EmbeddedResourceUseDependentUponConvention ai progetti .NET Core. Per impostazione predefinita, i file di risorse non sono elencati in modo esplicito in un file di progetto .NET Core, pertanto non hanno metadati DependentUpon per specificare come assegnare un nome al file .resources generato. Quando EmbeddedResourceUseDependentUponConvention è impostato su true, che è l'impostazione predefinita, MSBuild cerca un file di origine colocato ed estrae uno spazio dei nomi e un nome di classe da quel file. Se si imposta EmbeddedResourceUseDependentUponConvention su false, MSBuild genera il nome del manifesto in base al comportamento precedente, che combina RootNamespace e il percorso del file relativo.

Azione consigliata

Nella maggior parte dei casi, non è necessaria alcuna azione da parte dello sviluppatore e l'app deve continuare a funzionare. Tuttavia, se questa modifica interrompe l'app, puoi:

  • Modificare il codice in modo da prevedere il nuovo nome del manifesto.

  • Rifiutare esplicitamente la nuova convenzione di denominazione impostando EmbeddedResourceUseDependentUponConvention su false nel file di progetto.

    <PropertyGroup>
      <EmbeddedResourceUseDependentUponConvention>false</EmbeddedResourceUseDependentUponConvention>
    </PropertyGroup>
    

Categoria

MSBuild

API interessate

N/A


Rete

.NET Core 2.0

WebClient.CancelAsync non sempre annulla immediatamente

A partire da .NET Core 2.0, la chiamata a WebClient.CancelAsync() non annulla immediatamente la richiesta se la risposta è già in fase di recupero.

Modificare la descrizione

In precedenza, la chiamata WebClient.CancelAsync() annullava immediatamente la richiesta. A partire da .NET Core 2.0, la chiamata WebClient.CancelAsync() annulla immediatamente la richiesta solo se la risposta non è ancora in fase di recupero. Se la risposta ha iniziato il recupero, l'annullamento della richiesta avviene solo dopo la lettura di una risposta completa.

Questa modifica è stata implementata perché l'API WebClient è deprecata a favore di HttpClient.

Versione introdotta

2.0

Azione consigliata

Usare la classe System.Net.Http.HttpClient anziché System.Net.WebClient, che è deprecata.

Categoria

Reti di Comunicazione

API interessate


Windows Forms

Il supporto di Windows Form è stato aggiunto a .NET Core nella versione 3.0. Se si esegue la migrazione di un'app Windows Form da .NET Framework a .NET Core, le modifiche di rilievo elencate di seguito potrebbero influire sull'app.

.NET Core 3.1

Controlli rimossi

A partire da .NET Core 3.1, alcuni controlli Windows Form non sono più disponibili.

Modificare la descrizione

A partire da .NET Core 3.1, i vari controlli Windows Form non sono più disponibili. I controlli di sostituzione con progettazione e supporto migliori sono stati introdotti in .NET Framework 2.0. I controlli deprecati sono stati rimossi in precedenza dalle caselle degli strumenti del designer, ma erano ancora disponibili per essere utilizzati.

I tipi seguenti non sono più disponibili:

Versione introdotta

3.1

Azione consigliata

Ogni controllo rimosso ha un controllo sostitutivo consigliato. Fare riferimento alla tabella seguente:

Controllo rimosso (API) Sostituzione consigliata API associate che vengono rimosse
ContextMenu ContextMenuStrip
DataGrid DataGridView DataGridCell, DataGridRow, DataGridTableCollection, DataGridColumnCollection, DataGridTableStyle, DataGridColumnStyle, DataGridLineStyle, DataGridParentRowsLabel, DataGridParentRowsLabelStyle, DataGridBoolColumn, DataGridTextBox, GridColumnStylesCollection, GridTableStylesCollection, HitTestType
Menu Principale MenuStrip
Menù ToolStripDropDown, ToolStripDropDownMenu CollezioneDiVociDiMenu
Voce di menu ToolStripMenuItem
Barra degli strumenti ToolStrip Aspetto della Barra degli Strumenti
Pulsante della Barra degli Strumenti ToolStripButton (pulsante della barra degli strumenti) ToolBarButtonClickEventArgs, ToolBarButtonClickEventHandler, ToolBarButtonStyle, ToolBarTextAlign

Categoria

Windows Forms

API interessate


Evento CellFormatting non è generato se viene visualizzato il tooltip

Un DataGridView ora mostra il testo e le descrizioni comando di errore di una cella quando vi si passa sopra con il mouse e quando viene selezionata con la tastiera. Se viene visualizzato un tooltip, l'evento DataGridView.CellFormatting non viene generato.

Modificare la descrizione

Prima di .NET Core 3.1, un DataGridView con la proprietà ShowCellToolTips impostata su true mostrava un suggerimento per il testo della cella e per gli errori quando il cursore del mouse vi passava sopra. Le descrizioni comando non sono state visualizzate quando una cella è stata selezionata tramite la tastiera, ad esempio utilizzando il tasto Tab, i tasti di scelta rapida o i tasti freccia. Se l'utente modificava una cella e poi, mentre il DataGridView era ancora in modalità di modifica, passava sopra una cella che non aveva la proprietà ToolTipText impostata, veniva generato un evento CellFormatting per formattare il testo della cella per la visualizzazione.

Per soddisfare gli standard di accessibilità, a partire da .NET Core 3.1, un DataGridView con la proprietà ShowCellToolTips impostata su true mostra le descrizioni comando per il testo di una cella e i relativi errori non solo quando il cursore passa sopra la cella, ma anche quando viene selezionata tramite la tastiera. Di conseguenza di questa modifica, l'evento CellFormatting viene non generato quando le celle che non dispongono del set di proprietà ToolTipText vengono spostate al passaggio del mouse mentre il DataGridView è in modalità di modifica. L'evento non viene generato perché il contenuto della cella su cui si passa il mouse viene visualizzato come descrizione comando anziché nella cella.

Versione introdotta

3.1

Azione consigliata

Rifattorizzare qualsiasi codice che si basa sull'evento CellFormatting mentre il DataGridView è in modalità modifica.

Categoria

Windows Forms

API interessate

Nessuno


.NET Core 3.0

Il tipo di carattere del controllo predefinito è stato modificato in Segoe UI 9 pt

Modificare la descrizione

In .NET Framework la proprietà Control.DefaultFont è stata impostata su Microsoft Sans Serif 8.25 pt. L'immagine seguente mostra una finestra che usa il tipo di carattere predefinito.

Tipo di carattere controllo predefinito in .NET Framework

A partire da .NET Core 3.0, il tipo di carattere predefinito è impostato su Segoe UI 9 pt (lo stesso tipo di carattere di SystemFonts.MessageBoxFont). Come risultato di questa modifica, i moduli e i controlli vengono ridimensionati di circa 27 unità% per registrare le dimensioni maggiori del nuovo tipo di carattere predefinito. Per esempio:

Carattere di controllo predefinito in .NET Core

Questa modifica è stata apportata per allinearsi alle linee guida dell'esperienza utente di Windows .

Versione introdotta

3.0

Azione consigliata

A seguito della modifica delle dimensioni dei moduli e dei controlli, assicurarsi che l'applicazione venga visualizzata correttamente.

Per mantenere il tipo di carattere originale per un singolo modulo, impostarne il tipo di carattere predefinito su Microsoft Sans Serif 8.25 pt. Per esempio:

public MyForm()
{
    InitializeComponent();
    Font = new Font(new FontFamily("Microsoft Sans Serif"), 8.25f);
}

In alternativa, è possibile modificare il tipo di carattere predefinito per un'intera applicazione in uno dei modi seguenti:

  • Impostando la proprietà MSBuild ApplicationDefaultFont su "Microsoft Sans Serif, 8.25pt". Questa è la tecnica preferita perché consente a Visual Studio di usare le nuove impostazioni nella finestra di progettazione.

    <PropertyGroup>
      <ApplicationDefaultFont>Microsoft Sans Serif, 8.25pt</ApplicationDefaultFont>
    </PropertyGroup>
    
  • Chiamando Application.SetDefaultFont(Font).

    class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.SetHighDpiMode(HighDpiMode.SystemAware);
            Application.SetDefaultFont(new Font(new FontFamily("Microsoft Sans Serif"), 8.25f));
            Application.Run(new Form1());
        }
    }
    

Categoria

  • Windows Forms

API interessate

Nessuno.


Modernizzazione di FolderBrowserDialog

Il controllo FolderBrowserDialog è stato modificato nelle applicazioni Windows Form per .NET Core.

Modificare la descrizione

In .NET Framework Windows Form usa la finestra di dialogo seguente per il controllo FolderBrowserDialog:

Il controllo di dialogo per la selezione cartelle nel .NET Framework

In .NET Core 3.0 Windows Form usa un controllo basato su COM più recente introdotto in Windows Vista:

Il controllo FolderBrowserDialogControl in .NET Core

Versione introdotta

3.0

Azione consigliata

La finestra di dialogo verrà aggiornata automaticamente.

Se si desidera mantenere la finestra di dialogo originale, impostare la proprietà FolderBrowserDialog.AutoUpgradeEnabled su false prima di visualizzare il dialogo, come illustrato nel frammento di codice seguente:

var dialog = new FolderBrowserDialog();
dialog.AutoUpgradeEnabled = false;
dialog.ShowDialog();

Categoria

Windows Forms

API interessate


SerializableAttribute è stato rimosso da alcuni tipi di Windows Forms

Il SerializableAttribute è stato rimosso da alcune classi di Windows Form che non hanno scenari di serializzazione binari noti.

Modificare la descrizione

I tipi seguenti sono decorati con il SerializableAttribute in .NET Framework, ma l'attributo è stato rimosso in .NET Core:

Storicamente, questo meccanismo di serializzazione ha avuto gravi problemi di manutenzione e sicurezza. Mantenere SerializableAttribute sui tipi significa che questi tipi devono essere testati nei cambiamenti di serializzazione tra versioni e potenzialmente nei cambiamenti di serializzazione tra framework. In questo modo è più difficile evolvere tali tipi e può essere costoso da gestire. Questi tipi non hanno scenari di serializzazione binari noti, riducendo al minimo l'impatto della rimozione dell'attributo.

Per altre informazioni, vedere serializzazione binaria.

Versione introdotta

3.0

Azione consigliata

Aggiornare qualsiasi codice che può dipendere da questi tipi contrassegnati come serializzabili.

Categoria

Windows Forms

API interessate

  • Nessuno

Opzione di compatibilità AllowUpdateChildControlIndexForTabControls non supportata

L'opzione di compatibilità Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls è supportata in Windows Form in .NET Framework 4.6 e versioni successive, ma non è supportata in .NET Core o .NET 5.0 e versioni successive.

Modificare la descrizione

In .NET Framework 4.6 e versioni successive selezionare una scheda riordina la raccolta di controlli. L'opzione di compatibilità Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls consente a un'applicazione di ignorare questo riordinamento quando questo comportamento è indesiderato.

In .NET Core e .NET 5.0 e versioni successive, l'opzione Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls non è supportata.

Versione introdotta

3.0

Azione consigliata

Rimuovere l'interruttore. L'opzione non è supportata e non è disponibile alcuna funzionalità alternativa.

Categoria

Windows Forms

API interessate

  • Nessuno

Opzione di compatibilità DomainUpDown.UseLegacyScrolling non supportata

L'opzione di compatibilità Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling introdotta in .NET Framework 4.7.1 non è supportata in Windows Form in .NET Core o .NET 5.0 e versioni successive.

Modificare la descrizione

A partire da .NET Framework 4.7.1, lo switch di compatibilità Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling consente agli sviluppatori di decidere di non utilizzare le azioni indipendenti DomainUpDown.DownButton() e DomainUpDown.UpButton(). L'opzione ha ripristinato il comportamento legacy, nel quale il DomainUpDown.UpButton() viene ignorato se il testo del contesto è presente, e lo sviluppatore deve usare l'azione DomainUpDown.DownButton() sul controllo prima dell'azione DomainUpDown.UpButton(). Per altre informazioni, vedere <l'elemento AppContextSwitchOverrides>.

In .NET Core e .NET 5.0 e versioni successive, l'opzione Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling non è supportata.

Versione introdotta

3.0

Azione consigliata

Rimuovere l'interruttore. L'opzione non è supportata e non è disponibile alcuna funzionalità alternativa.

Categoria

Windows Forms

API interessate


Interruttore di compatibilità DoNotLoadLatestRichEditControl non supportato

L'opzione di compatibilità Switch.System.Windows.Forms.UseLegacyImages introdotta in .NET Framework 4.7.1 non è supportata in Windows Form in .NET Core o .NET 5.0 e versioni successive.

Modificare la descrizione

In .NET Framework 4.6.2 e versioni precedenti, il controllo RichTextBox crea un'istanza del controllo RichEdit Win32 v3.0 e per le applicazioni destinate a .NET Framework 4.7.1, il controllo RichTextBox crea un'istanza di RichEdit v4.1 (in msftedit.dll). Il commutatore di compatibilità Switch.System.Windows.Forms.DoNotLoadLatestRichEditControl è stato introdotto per consentire alle applicazioni destinate a .NET Framework 4.7.1 e versioni successive di rifiutare esplicitamente il nuovo controllo RichEdit v4.1 e usare invece il vecchio controllo RichEdit v3.

In .NET Core e .NET 5.0 e versioni successive, l'opzione Switch.System.Windows.Forms.DoNotLoadLatestRichEditControl non è supportata. Sono supportate solo le nuove versioni del controllo RichTextBox.

Versione introdotta

3.0

Azione consigliata

Rimuovere l'interruttore. L'opzione non è supportata e non è disponibile alcuna funzionalità alternativa.

Categoria

Windows Forms

API interessate


Opzione di compatibilità DoNotSupportSelectAllShortcutInMultilineTextBox non supportata

L'opzione di compatibilità Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox introdotta in .NET Framework 4.6.1 non è supportata in Windows Form in .NET Core e .NET 5.0 e versioni successive.

Modificare la descrizione

A partire da .NET Framework 4.6.1, selezionando il tasto di scelta rapida CTRL + A in un controllo TextBox seleziona tutto il testo. In .NET Framework 4.6 e versioni precedenti, selezionando il tasto di scelta rapida CTRL + non riusciva a selezionare tutto il testo se le proprietà Textbox.ShortcutsEnabled e TextBox.Multiline erano entrambe impostate su true. Il commutatore di compatibilità Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox è stato introdotto in .NET Framework 4.6.1 per mantenere il comportamento originale. Per altre informazioni, vedere TextBox.ProcessCmdKey.

In .NET Core e .NET 5.0 e versioni successive, l'opzione Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox non è supportata.

Versione introdotta

3.0

Azione consigliata

Rimuovere l'interruttore. L'opzione non è supportata e non è disponibile alcuna funzionalità alternativa.

Categoria

Windows Forms

API interessate

  • Nessuno

Opzione di compatibilità DontSupportReentrantFilterMessage non supportata

L'opzione di compatibilità Switch.System.Windows.Forms.DontSupportReentrantFilterMessage introdotta in .NET Framework 4.6.1 non è supportata in Windows Form in .NET Core e .NET 5.0 e versioni successive.

Modificare la descrizione

A partire da .NET Framework 4.6.1, l'opzione di compatibilità Switch.System.Windows.Forms.DontSupportReentrantFilterMessage risolve possibili eccezioni IndexOutOfRangeException quando viene chiamato il messaggio Application.FilterMessage con un'implementazione IMessageFilter.PreFilterMessage personalizzata. Per altre informazioni, vedere Mitigazione : Implementazioni IMessageFilter.PreFilterMessage personalizzate.

In .NET Core e .NET 5.0 e versioni successive, l'opzione Switch.System.Windows.Forms.DontSupportReentrantFilterMessage non è supportata.

Versione introdotta

3.0

Azione consigliata

Rimuovere l'interruttore. L'opzione non è supportata e non è disponibile alcuna funzionalità alternativa.

Categoria

Windows Forms

API interessate


Interruttore di compatibilità EnableVisualStyleValidation non supportato

L'opzione di compatibilità Switch.System.Windows.Forms.EnableVisualStyleValidation non è supportata in Windows Forms su .NET Core o .NET 5.0 e successive.

Modificare la descrizione

In .NET Framework, l'opzione di compatibilità Switch.System.Windows.Forms.EnableVisualStyleValidation ha consentito a un'applicazione di rifiutare esplicitamente la convalida degli stili di visualizzazione forniti in un formato numerico.

In .NET Core e .NET 5.0 e versioni successive, l'opzione Switch.System.Windows.Forms.EnableVisualStyleValidation non è supportata.

Versione introdotta

3.0

Azione consigliata

Rimuovere l'interruttore. L'opzione non è supportata e non è disponibile alcuna funzionalità alternativa.

Categoria

Windows Forms

API interessate

  • Nessuno

Opzione di compatibilità UseLegacyContextMenuStripSourceControlValue non supportata

L'opzione di compatibilità Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue introdotta in .NET Framework 4.7.2 non è supportata in Windows Form in .NET Core o .NET 5.0 e versioni successive.

Modificare la descrizione

A partire da .NET Framework 4.7.2, l'opzione di compatibilità Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue consente allo sviluppatore di rifiutare esplicitamente il nuovo comportamento della proprietà ContextMenuStrip.SourceControl, che ora restituisce un riferimento al controllo del codice sorgente. Il comportamento precedente della proprietà era di restituire il null. Per ulteriori informazioni, vedere <AppContextSwitchOverrides> elemento.

In .NET Core e .NET 5.0 e versioni successive, l'opzione Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue non è supportata.

Versione introdotta

3.0

Azione consigliata

Rimuovere l'interruttore. L'opzione non è supportata e non è disponibile alcuna funzionalità alternativa.

Categoria

Windows Forms

API interessate


Opzione di compatibilità UseLegacyImages non supportata

L'opzione di compatibilità Switch.System.Windows.Forms.UseLegacyImages introdotta in .NET Framework 4.8 non è supportata in Windows Form in .NET Core o .NET 5.0 e versioni successive.

Modificare la descrizione

A partire da .NET Framework 4.8, il commutatore di compatibilità Switch.System.Windows.Forms.UseLegacyImages ha risolto i possibili problemi di ridimensionamento delle immagini negli scenari ClickOnce in ambienti con valori DPI elevati. Quando impostato su true, l'interruttore consente all'utente di ripristinare il ridimensionamento delle immagini legacy su schermi ad alta risoluzione DPI la cui scala è impostata su un valore maggiore di 100%. Per ulteriori informazioni, vedere note sulla versione di .NET Framework 4.8 su GitHub.

In .NET Core e .NET 5.0 e versioni successive, l'opzione Switch.System.Windows.Forms.UseLegacyImages non è supportata.

Versione introdotta

3.0

Azione consigliata

Rimuovere l'interruttore. L'opzione non è supportata e non è disponibile alcuna funzionalità alternativa.

Categoria

Windows Forms

API interessate

  • Nessuno

I modelli About e SplashScreen sono non funzionanti

I file About.vb e SplashScreen.vb generati da Visual Studio contengono riferimenti ai tipi nello spazio dei nomi My che non sono disponibili in .NET Core 3.0 e 3.1.

Versione introdotta

3.0

Modificare la descrizione

.NET Core 3.0 e 3.1 non contengono il supporto completo di Visual Basic My. I modelli di modulo Informazioni su e SplashScreen in Visual Studio per le app Windows Form di Visual Basic fanno riferimento a proprietà nel tipo My.Application.Info che non sono disponibili.

Azione consigliata

Il supporto di Visual Basic My è stato migliorato in .NET 5, aggiornare il progetto a .NET 5 o versione successiva.

-o-

Correggi gli errori del compilatore nei tipi About e SplashScreen nell'app. Usare la classe System.Reflection.Assembly per ottenere le informazioni fornite dal tipo My.Application.Info. Qui è disponibile una porta dritta di entrambe le forme.

Suggerimento

Si tratta di codice di esempio e non ottimizzata. L'elenco degli attributi deve essere memorizzato nella cache per ridurre il tempo di caricamento dei moduli.

Informazioni su

Imports System.Reflection

Public NotInheritable Class About

    Private Sub about_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ' Set the title of the form.
        Dim applicationTitle As String = Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyTitleAttribute)()?.Title

        If String.IsNullOrEmpty(applicationTitle) Then
            applicationTitle = System.IO.Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().GetName().Name)
        End If

        Me.Text = String.Format("About {0}", applicationTitle)
        ' Initialize all of the text displayed on the About Box.
        ' TODO: Customize the application's assembly information in the "Application" pane of the project
        '    properties dialog (under the "Project" menu).
        Me.LabelProductName.Text = If(Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyProductAttribute)()?.Product, "")
        Me.LabelVersion.Text = String.Format("Version {0}", Assembly.GetExecutingAssembly().GetName().Version)
        Me.LabelCopyright.Text = If(Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyCopyrightAttribute)()?.Copyright, "")
        Me.LabelCompanyName.Text = If(Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyCompanyAttribute)()?.Company, "")
        Me.TextBoxDescription.Text = If(Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyDescriptionAttribute)()?.Description, "")
    End Sub

    Private Sub OKButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OKButton.Click
        Me.Close()
    End Sub

End Class

SplashScreen

Imports System.Reflection

Public NotInheritable Class SplashScreen

    Private Sub SplashScreen1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        'Set up the dialog text at runtime according to the application's assembly information.  

        'TODO: Customize the application's assembly information in the "Application" pane of the project
        '  properties dialog (under the "Project" menu).

        'Application title
        Dim appTitle As String = Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyTitleAttribute)()?.Title

        If String.IsNullOrEmpty(appTitle) Then
            appTitle = System.IO.Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().GetName().Name)
        End If

        ApplicationTitle.Text = appTitle

        Dim versionValue = Assembly.GetExecutingAssembly().GetName().Version

        'Format the version information using the text set into the Version control at design time as the
        '  formatting string.  This allows for effective localization if desired.
        '  Build and revision information could be included by using the following code and changing the
        '  Version control's designtime text to "Version {0}.{1:00}.{2}.{3}" or something similar.  See
        '  String.Format() in Help for more information.
        '
        '    Version.Text = System.String.Format(Version.Text, versionValue.Major, versionValue.Minor, versionValue.Build, versionValue.Revision)

        Version.Text = System.String.Format(Version.Text, versionValue.Major, versionValue.Minor)

        'Copyright info
        Copyright.Text = If(Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyCopyrightAttribute)()?.Copyright, "")
    End Sub

End Class

Categoria

Forme Windows di Visual Basic

API interessate

Nessuno


I tipi nello spazio dei nomi Microsoft.VisualBasic.ApplicationServices non sono disponibili.

I tipi nello spazio dei nomi Microsoft.VisualBasic.ApplicationServices non sono disponibili.

Versione introdotta

.NET Core 3.0

Modificare la descrizione

I tipi nello spazio dei nomi Microsoft.VisualBasic.ApplicationServices erano disponibili in .NET Framework. Non sono disponibili in .NET Core 3.0 - 3.1.

I tipi sono stati rimossi per evitare dipendenze di assembly non necessarie o modifiche significative nelle versioni successive.

Azione consigliata

Questo spazio dei nomi è stato aggiunto in .NET 5, aggiorna il progetto a .NET 5 o versione successiva.

-o-

Se il codice dipende dall'uso di Microsoft.VisualBasic.ApplicationServices tipi e dai relativi membri, è possibile usare un tipo o un membro corrispondente nella libreria di classi .NET. Ad esempio, alcuni membri System.Environment e System.Security.Principal.WindowsIdentity forniscono funzionalità equivalenti alle proprietà della classe Microsoft.VisualBasic.ApplicationServices.User.

Categoria

Visual Basic

API interessate


I tipi nello spazio dei nomi Microsoft.VisualBasic.Devices risultano non disponibili.

I tipi nello spazio dei nomi Microsoft.VisualBasic.Devices non sono disponibili.

Versione introdotta

.NET Core 3.0

Modificare la descrizione

I tipi nello spazio dei nomi Microsoft.VisualBasic.Devices erano disponibili in .NET Framework. Non sono disponibili in .NET Core 3.0 - 3.1.

I tipi sono stati rimossi per evitare dipendenze di assembly non necessarie o cambiamenti improvvisi nelle versioni successive.

Azione consigliata

Questo spazio dei nomi è stato aggiunto in .NET 5, aggiornare il progetto a .NET 5 o versione successiva.

-o-

Se il codice dipende dall'uso di Microsoft.VisualBasic.Devices tipi e dai relativi membri, è possibile usare un tipo o un membro corrispondente nella libreria di classi .NET. Ad esempio, la funzionalità equivalente alla classe Microsoft.VisualBasic.Devices.Clock viene fornita dai tipi System.DateTime e System.Environment e la funzionalità equivalente alla classe Microsoft.VisualBasic.Devices.Ports viene fornita dai tipi nello spazio dei nomi System.IO.Ports.

Categoria

Visual Basic

API interessate


Tipi nello spazio dei nomi Microsoft.VisualBasic.MyServices non sono disponibili

I tipi nello spazio dei nomi Microsoft.VisualBasic.MyServices non sono disponibili.

Versione introdotta

.NET Core 3.0

Modificare la descrizione

I tipi nel namespace Microsoft.VisualBasic.MyServices erano disponibili in .NET Framework. Non sono disponibili in .NET Core 3.0 - 3.1.

I tipi sono stati rimossi per evitare dipendenze di assembly non necessarie o cambiamenti distruttivi alle versioni successive.

Azione consigliata

Questo namespace è stato aggiunto in .NET 5. Aggiorna il progetto a .NET 5 o successive.

-o-

Se il codice si basa sull'utilizzo di tipi Microsoft.VisualBasic.MyServices e dei loro membri, ci sono tipi e membri corrispondenti nella libreria di classi .NET. Di seguito è riportata una mappatura dei tipi di Microsoft.VisualBasic.MyServices ai tipi equivalenti di libreria di classi .NET:

Tipo Microsoft.VisualBasic.MyServices Tipo di libreria di classi .NET
ClipboardProxy System.Windows.Clipboard per applicazioni WPF, System.Windows.Forms.Clipboard per le applicazioni Windows Form
FileSystemProxy Tipi nello spazio dei nomi System.IO
RegistryProxy Tipi correlati al Registro di sistema nello spazio dei nomi Microsoft.Win32
SpecialDirectoriesProxy Environment.GetFolderPath

Categoria

Visual Basic

API interessate


Vedere anche