Windows フォーム (WinForms) アプリでWindows アプリ SDKを使用する

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

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

また、既存の WinForms プロジェクトをまだ持っていない場合、またはプロセスを実行する場合は、このトピックに従って、Windows アプリ SDK API を呼び出すように構成できるように WinForms プロジェクトを作成する手順が含まれています。

前提条件

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

重要

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

パッケージ化およびパッケージ化されていない用語の詳細については、「アプリをパッケージする利点と欠点」を参照してください。

まだ存在しない場合は、WinForms プロジェクトを作成します

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

  1. Visual Studio で、新しい C# Windows フォーム App プロジェクト (.NET プロジェクト) を作成します。 Windows フォーム アプリ (.NET Framework) ではなく、App Windows フォーム正確な名前のプロジェクト テンプレートを選択してください。
  2. プロジェクトに名前を付け、既定のオプションを受け入れます。

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

Windows アプリ SDKサポート用に WinForms プロジェクトを構成する

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

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

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

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

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

    <WindowsPackageType>None</WindowsPackageType>
    

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

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

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

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

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

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

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

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

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

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

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

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

    4. ([コードの表示] コマンドを使用して) を開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 アプリ ランタイムが必要であることを示すメッセージ ボックスが表示され、今すぐインストールするかどうかを確認するメッセージ が表示された場合は、[ はい] をクリックします。 これで、Windows アプリ SDKの最新のダウンロードが表示されます。 詳細については、上記の 「前提条件 」セクションを参照してください。

また、「ランタイム アーキテクチャ」を参照して、アプリがWindows アプリ SDKを使用するときにアプリが受け取るフレームワーク パッケージの依存関係と、パッケージ化されていないアプリで動作するために必要な追加コンポーネントの詳細を確認してください。

MSIX を使用して WinForms アプリをパッケージ化してデプロイする

一部の Windows 機能と API (Windows アプリ 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. [ソリューション プラットフォーム] ドロップダウンで、[任意の Cpu] ではなく [x64] を選択します。
  11. ビルドして実行できることを確認します。

WinForms アプリをパッケージ化したので、パッケージ ID を必要とする API を呼び出すことができます。 そのため、([コードの表示] コマンドを使用して) を開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);
}

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

注意

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