Compartilhar via


Os modelos C# usam inicialização de aplicativo

De acordo com as alterações relacionadas nas cargas de trabalho do .NET, os modelos do Windows Forms para C# foram atualizados para dar suporte a diretivas global using, namespaces com escopo de arquivo e tipos de referência anuláveis. Como um aplicativo Windows Forms típico consiste em vários tipos divididos em vários arquivos, por exemplo, Form1.cs e Form1.Designer.cs, as instruções de nível superior estão notavelmente ausentes dos modelos do Windows Forms. No entanto, os modelos atualizados incluem o código de inicialização do aplicativo. Isso pode causar incompatibilidade se você direcionar uma versão anterior do .NET.

Versão introduzida

.NET 6 RC 1

Comportamento antigo

Um ponto de entrada do aplicativo Windows Forms era semelhante a este:

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());
        }
    }
}

Novo comportamento

O novo ponto de entrada do aplicativo para um aplicativo .NET 6+ tem esta aparência:

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() é uma API efêmera produzida pelo compilador Roslyn (por meio de geradores de origem). Esse método emite as mesmas chamadas que tinham os modelos originais. Você pode configurar o comportamento dessa API definindo as seguintes propriedades do MSBuild:

Se você não configurar explicitamente nenhuma propriedade, o seguinte código será executado em tempo de execução:

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 da alteração

Essa alteração afeta a compatibilidade de origem.

Motivo da alteração

O recurso de inicialização do aplicativo:

  • Permite que o designer de Windows Forms renderize a superfície de design na fonte preferencial.
  • Reduz o código clichê nos modelos.

Se a mesma origem for usada para criar um aplicativo direcionado a vários TFMs, você poderá fazer um dos seguintes procedimentos:

  • Substitua a chamada ApplicationConfiguration.Initialize(); pelo código original (e perca o suporte do designer para API Application.SetDefaultFont).

  • Use diretivas #if...#endif, por exemplo:

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

APIs afetadas

N/D