C# テンプレートでアプリケーション ブートストラップが使用される

.NET ワークロードでの関連する変更に従って、C# 用の Windows フォームのテンプレートが更新され、global using ディレクティブ、ファイルスコープの名前空間、および null 許容参照型をサポートするようになりました。 一般的な Windows フォーム アプリは複数のファイルにわたって分割された複数の種類で構成されているため (たとえば、Form1.cs や Form1.Designer.cs など)、特に最上位レベルのステートメントは、Windows フォームのテンプレートには存在しません。 ただし、更新されたテンプレートには、アプリケーション ブートストラップ コードが含まれています。 これにより、.NET の以前のバージョンを対象としている場合に非互換性が発生する可能性があります。

導入されたバージョン

.NET 6 RC 1

以前の動作

Windows フォーム アプリケーションのエントリ ポイントは次のようになります。

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 フォーム デザイナーで、デザイン サーフェイスを優先フォントで表示できるようにします。
  • テンプレート内の定型コードを減らします。

複数の 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

該当なし