Windows Forms (WinForms) アプリで Windows App SDK を使用する

Windows App SDK は、次世代の Windows アプリ開発プラットフォームです。 ただし、このトピックでは、Windows Forms (WinForms) アプリで Windows App SDK API (および Windows Runtime API) を使用する方法について説明します。

  • 多くの場合、WinForms アプリを WinUI 3 アプリの形式で 再作成する必要があります。 WinUI 3 に移行する利点の 1 つは、Fluent Design Systemへのアクセスが可能になることです (「Windows アプリの設計とコーディング」も参照してください)。 また、WinUI 3 は Windows App SDK の一部であるため、WinUI 3 アプリでは Windows App SDK の他の機能や API も使用できます。 このトピックでは、WinForms アプリを WinUI 3 に移行するプロセスについては説明しません。
  • WinUI 3 でまだ利用できない WinForms の機能を使用している場合は、WinForms アプリでも、Windows App SDK の機能 (アプリのライフサイクル、MRT Core、DWriteCore など) を使用することができます。 このトピックでは方法を説明します。

既存の WinForms プロジェクトがない場合、または作成プロセスを実践しようとしている場合は、このトピックの手順に従うと、WinForms プロジェクトを作成し、Windows App SDK API を呼び出すように構成できます。

前提条件

  1. Windows App SDK 用のツールをインストールする
  2. このトピックでは、パッケージ化されていない WinForms アプリとパッケージ化された WinForms アプリの両方について説明します。 WinForms アプリが非パッケージ (WinForms アプリの既定の状態) の場合は、非パッケージ アプリのすべての依存関係がインストールされていることを確認してください (フレームワークに依存する、外部の場所でパッケージ化されたアプリまたは非パッケージ アプリ向けの Windows App SDK 展開ガイドを参照してください)。 これを簡単に行うには、「Windows App SDK 用の最新のダウンロード」にアクセスし、安定版リリースのいずれかを [ランタイムのダウンロード] からダウンロードして、解凍および実行します。

重要

インストールするランタイムのバージョンは、後の手順でインストールする Microsoft.WindowsAppSDK NuGet パッケージのバージョンと一致している必要があります。

非パッケージパッケージという用語については、「アプリをパッケージ化することの長所と短所」を参照してください。

WinForms プロジェクトがない場合は、作成します。

WinForms プロジェクトがすでにある場合は、次のセクションに進みます。

  1. Visual Studio で、新しい C# Windows Forms App プロジェクト (.NET プロジェクト) を作成します。 プロジェクト テンプレートは、Windows Forms App (.NET Framework) ではなく、Windows Forms App という正確な名前のプロジェクト テンプレートを選択するように注意してください。
  2. プロジェクト名を設定し、既定のオプションをそのまま使用します。

これで、パッケージ化されていない WinForms アプリをビルドするプロジェクトが作成されました。

Windows App SDK をサポートするように WinForms プロジェクトを構成する

まず、プロジェクト ファイルを編集します。

  1. ソリューション エクスプローラーで、プロジェクトを右クリックし、[プロジェクト ファイルの編集] を選択します。

  2. この手順では、Windows ランタイム (WinRT) API (Windows App SDK API を含む) を呼び出すことができるようにします。 PropertyGroup 要素内には TargetFramework 要素があり、net6.0 のような値に設定されています。 このターゲット フレームワークの値の末尾に、モニカー (具体的にはターゲット フレーム モニカー) を追加します。 たとえば、アプリが Windows 10 Version 2004 をターゲットとしている場合は、次のように指定します。

    <TargetFramework>net6.0-windows10.0.19041.0</TargetFramework>
    
  3. また、PropertyGroup 要素内に、次のように RuntimeIdentifiers 要素を追加します。

    <RuntimeIdentifiers>win10-x86;win10-x64;win10-arm64</RuntimeIdentifiers>
    
  4. 既定では、WinForms アプリはパッケージ化されていません (つまり、MSIX を使用してインストールされません)。 非パッケージ アプリでは、Windows App SDK のいずれかの機能を使用する前に、Windows App SDK ランタイムを初期化する必要があります。 自動初期化を使用すると、これをアプリの起動時に自動的に行うことができます。 そのためには、WindowsPackageType プロジェクト プロパティを次のように適切に設定するだけです (これも PropertyGroup 要素内で指定します)。

    <WindowsPackageType>None</WindowsPackageType>
    

    高度なニーズがある場合は (カスタム エラー処理が必要な場合や、特定のバージョンの Windows App SDK を読み込む場合など)、自動初期化の代わりに、ブートストラップ API を明示的に呼び出すことができます。詳細については、外部の場所を持つパッケージ アプリまたは非パッケージ アプリで Windows App SDK ランタイムを使用する方法に関するトピックを参照してください。

  5. プロジェクト ファイルを保存して閉じます。

次に、プロジェクトに Windows App SDK NuGet パッケージをインストールします。

  1. ソリューション エクスプローラーで、プロジェクトの [依存関係] ノードを右クリックし、[NuGet パッケージの管理] を選択します。
  2. NuGet パッケージ マネージャー ウィンドウで Browse タブを選択し、Latest stable Microsoft.WindowsAppSDK パッケージをインストールします。

WinForms アプリで Windows App SDK の機能を使用する

このセクションでは、WinForms アプリから Windows App SDK API を呼び出す非常に簡単な例を示します。 この例は MRT Core の機能を使用します (「MRT Core を使用してリソースを管理する」を参照してください)。 この例を WinForms プロジェクトに適用できる場合は (このチュートリアル用に新しいプロジェクトを作成した場合も該当します)、次の手順に従うことができます。

  1. (View Designer コマンドを使用して)Form1.cs を開き、[ツールボックス]から、[ボタン][ラベル] をデザイナーにドラッグします。

  2. [button1] をダブルクリックして、イベント ハンドラーを生成します。

  3. 次に、Windows App SDK の ResourceManager クラスを使用して文字列リソースを読み込むコードを追加します。

    1. 新しいリソース ファイル (.resw) 項目をプロジェクトに追加します (既定の名前である Resources.resw をそのまま使用します)。

    2. エディターでリソース ファイルを開いて、次のプロパティを使用して新しい文字列リソースを作成します。

      • 名前: Message
      • 値: Hello, resources!
    3. リソース ファイルを保存して閉じます。

    4. (View Code コマンドを使用して) Form1.cs を開き、次のようにイベント ハンドラーを編集します。

    private void button1_Click(object sender, EventArgs e)
    {
        // Construct a resource manager using the resource index generated during build.
        var manager =
            new Microsoft.Windows.ApplicationModel.Resources.ResourceManager();
    
        // Look up a string in the resources file using the string's name.
        label1.Text = manager.MainResourceMap.GetValue("Resources/Message").ValueAsString;
    }
    
  4. プロジェクトをビルドし、アプリを実行します。 ボタンをクリックすると、"Hello, resources!" という文字列が表示されます。

ヒント

実行時に、アプリケーションには特定のバージョンの Windows App ランタイムが必要であり、今すぐインストールするかどうかをたずねるメッセージ ボックスが表示された場合は、[はい] をクリックします。 これにより、「Windows App SDK 用の最新のダウンロード」ページが開きます。 詳細については、上の「前提条件」セクションを参照してください。

アプリで Windows App SDK を使用する場合に適用されるフレームワーク パッケージの依存関係の詳細と、非パッケージ アプリに必要な追加コンポーネントについては、ランタイム アーキテクチャに関するトピックを参照してください。

MSIX を使用した WinForms のパッケージ化とデプロイ

Windows の一部の機能と API (Windows App SDK の通知 API を含む) では、実行時にアプリにパッケージ ID があることが求められます (つまり、アプリがパッケージ化されている必要があります)。 詳しくは、「パッケージ ID が必要な機能」を参照してください。

  1. Visual Studio のソリューション エクスプローラーで、ソリューションを右クリックし、[追加] > [新しいプロジェクト] の順に選択します。
  2. [新しいプロジェクトの追加] ダイアログ ボックスで、「パッケージ」を検索し、C# の [Windows アプリケーション パッケージ プロジェクト] プロジェクト テンプレートを選択して、[次へ] をクリックします。
  3. プロジェクトに名前を付け、[作成] をクリックします。
  4. ソリューション内のどのアプリケーションをパッケージに含めるかを指定します。 パッケージ プロジェクト (WinForms プロジェクトではない) で、[依存関係] ノードを右クリックし、[プロジェクト参照を追加...] を選択します。
  5. ソリューション内のプロジェクトの一覧で、WinForms プロジェクトを選択し、[OK] をクリックします。
  6. パッケージ プロジェクトの [依存関係] > [アプリケーション] ノードを展開し、WinForms プロジェクトが参照されて太字で強調表示されていることを確認します。 これは、これがパッケージの開始点として使用されることを意味します。
  7. パッケージ プロジェクトを右クリックし、[スタートアップ プロジェクトに設定] を選択します。
  8. [WinForms プロジェクト] を右クリックし、[プロジェクト ファイルを編集] を選択します。
  9. <WindowsPackageType>None</WindowsPackageType> を削除し、保存して閉じます。
  10. [ソリューション プラットフォーム] ドロップダウンで、[x64] を選択します ([Any CPU] から変更します)。
  11. ビルドして実行できることを確認します。

WinForms アプリをパッケージ化したので、パッケージ ID を必要とする API を呼び出すことができます。 (View Code コマンドを使用して) Form1.cs を開き、次のようにイベント ハンドラーを編集します。

private void button1_Click(object sender, EventArgs e)
{
    var notification = new AppNotificationBuilder()
        .AddArgument("action", "viewConversation")
        .AddArgument("conversationId", "9813")
        .AddText("Andrew sent you a picture")
        .AddText("Check this out, The Enchantments in Washington!")
        .BuildNotification();

    AppNotificationManager.Default.Show(notification);
}

もう一度ビルドして実行します。 ボタンをクリックし、トースト通知が表示されることを確認します。 通知 API は、実行時にパッケージ ID のないプロセスから呼び出された場合、例外をスローします。

Note

このセクションの手順では、パッケージ アプリの作成方法を説明しました。 別の方法として、外部の場所を持つパッケージ アプリを作成することもできます。 これらの用語については、「アプリをパッケージ化することの長所と短所」を参照してください。