Шаблоны C# используют начальную загрузку приложения
Параллельно с соответствующими изменениями в рабочих нагрузках .NET были обновлены шаблоны Windows Forms для C#, чтобы они поддерживали директивы global using
, пространства имен в области файла и ссылочные типы, допускающие значение NULL. Поскольку типичное приложение Windows Forms состоит из нескольких типов, разнесенных по разным файлам (например, form1.cs и Form1. Designer.cs), инструкции верхнего уровня в шаблонах Windows Forms обычно отсутствуют. Однако обновленные шаблоны включают код начальной загрузки приложения. Это может привести к несовместимости при нацеливании на более ранние версии .NET.
Представленные версии
.NET 6 RC 1
Старое поведение
Точка входа в приложение Windows Forms выглядит следующим образом:
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());
}
}
}
Новое поведение
Новая точка входа в приложение .NET 6 и более новой версии выглядит следующим образом:
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()
представляет собой временный API, созданный компилятором Roslyn (через генераторы исходного кода). Этот метод создает те же вызовы, которые использовали исходные шаблоны. Вы можете настроить поведение этого API, задав следующие свойства MSBuild:
- ApplicationDefaultFont
- ApplicationHighDpiMode
- ApplicationUseCompatibleTextRendering
- ApplicationVisualStyles
Если вы не настроили свойства явным образом, во время выполнения выполняется следующий код:
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());
}
}
Категория изменения
Это изменение влияет на совместимость исходного кода.
Причина изменения
Возможность начальной загрузки для приложения полезна тем, что:
- позволяет конструктору Windows Forms отображать произвольный шрифт в области конструктора;
- сокращает объем стереотипного кода в шаблонах.
Рекомендуемое действие
Если для компиляции приложения, нацеленного на несколько моникеров целевой платформы, используется один и тот же исходный код, можно выполнить одно из следующих действий.
Замените вызов
ApplicationConfiguration.Initialize();
исходным кодом, теряя поддержку конструктора для APIApplication.SetDefaultFont
.Используйте директивы
#if...#endif
, например так:#if NET6_0_OR_GREATER ApplicationConfiguration.Initialize(); #else Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.SetHighDpiMode(HighDpiMode.SystemAware); #endif
Затронутые API
Н/Д