I modelli C# usano bootstrap dell'applicazione

In linea con le modifiche correlate nei carichi di lavoro .NET, i modelli Windows Form per C# sono stati aggiornati per supportare direttive global using, spazi dei nomi con ambito file e tipi di riferimento nullable. Poiché un'app Windows Forms tipica è costituita da più tipi suddivisi tra più file, ad esempio Form1.cs e Form1.Designer.cs, le istruzioni di primo livello sono notevolmente assenti dai modelli di Windows Form. Tuttavia, i modelli aggiornati includono il codice bootstrap dell'applicazione. Ciò può causare incompatibilità se si usa una versione precedente di .NET.

Versione di introduzione

.NET 6 RC 1

Comportamento precedente

Un punto di ingresso dell'applicazione Windows Forms ha un aspetto simile al seguente:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace MyApp
{
    static class Program
    {
        /// <summary>
        ///  The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.SetHighDpiMode(HighDpiMode.SystemAware);
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}

Nuovo comportamento

Il nuovo punto di ingresso dell'applicazione per un'applicazione .NET 6+ è simile al seguente:

namespace MyApp;

static class Program
{
    /// <summary>
    ///  The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        ApplicationConfiguration.Initialize();
        Application.Run(new Form1());
    }
}

ApplicationConfiguration.Initialize() è un'API temporanea prodotta dal compilatore Roslyn (tramite generatori di origine). Questo metodo genera le stesse chiamate che avevano i modelli originali. È possibile configurare il comportamento di questa API impostando le proprietà di MSBuild seguenti:

Se non si configura esplicitamente alcuna proprietà, in fase di esecuzione viene eseguito il codice seguente:

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        // ApplicationConfiguration.Initialize() will emit the following calls:
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.SetHighDpiMode(HighDpiMode.SystemAware);

        Application.Run(new Form1());
    }
}

Categoria di modifiche

Questa modifica influisce sulla compatibilità dell'origine.

Motivo della modifica

La funzionalità bootstrap dell'applicazione:

  • Consente alla finestra di progettazione di Windows Forms di eseguire il rendering dell'area di progettazione nel tipo di carattere preferito.
  • Riduce il codice boilerplate nei modelli.

Se la stessa origine viene usata per compilare un'applicazione destinata a più TFM, è possibile eseguire una delle seguenti operazioni:

  • Sostituire la chiamata ApplicationConfiguration.Initialize(); con il codice originale (e perdere il supporto della finestra di progettazione per l’API Application.SetDefaultFont).

  • Usare direttive #if...#endif, ad esempio:

    #if NET6_0_OR_GREATER
            ApplicationConfiguration.Initialize();
    #else
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.SetHighDpiMode(HighDpiMode.SystemAware);
    #endif
    

API interessate

N/D