다음을 통해 공유


C# 템플릿이 애플리케이션 부트스트랩을 사용함

.NET 워크로드의 관련 변경에 따라 #C의 Windows Forms 템플릿이 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()는 Roslyn 컴파일러에서 소스 생성기를 통해 생성하는 임시 API입니다. 이 메서드는 원래 템플릿에 있던 것과 동일한 호출을 내보냅니다. 다음 MSBuild 속성을 설정하여 이 API의 동작을 구성할 수 있습니다.

속성을 명시적으로 구성하지 않으면 런타임에 다음 코드가 실행됩니다.

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 디자이너가 디자인 화면을 기본 글꼴로 렌더링할 수 있도록 허용합니다.
  • 템플릿에서 상용구 코드를 줄입니다.

동일한 소스를 사용하여 여러 TFM을 대상으로 하는 애플리케이션을 빌드하는 경우 다음 중 하나를 수행할 수 있습니다.

  • ApplicationConfiguration.Initialize(); 호출을 원래 코드로 교체하고 Application.SetDefaultFont API에 대한 디자이너 지원을 잃습니다.

  • #if...#endif 지시문을 사용합니다. 예를 들면 다음과 같습니다.

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

영향을 받는 API

N/A