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:
- ApplicationDefaultFont
- ApplicationHighDpiMode
- ApplicationUseCompatibleTextRendering
- ApplicationVisualStyles
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.
Ação recomendada
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 APIApplication.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