Share via


チュートリアル - C#/WinRT コンポーネントを作成し、C++/WinRT から使用する

C#/WinRT を使うと、.NET を使用する開発者は、クラス ライブラリ プロジェクトを使って C# で独自の Windows ランタイム コンポーネントを作成できます。 作成されたコンポーネントは、ネイティブ デスクトップ アプリケーションでパッケージ参照として、またはいくつかの変更を加えたプロジェクト参照として使用することができます。

このチュートリアルでは、C#/WinRT を使用して単純な Windows ランタイム コンポーネントを作成し、コンポーネントを NuGet パッケージとして配布し、C++/WinRT コンソール アプリケーションからコンポーネントを使用する方法について説明します。 この記事のコードを提供する完全なサンプルについては、C#/WinRT 作成のサンプルを参照してください。 作成について詳しくは、コンポーネントの作成を参照してください。

Windows App SDK アプリケーションで特に使用する C#/WinRT での WinUI コントロールの作成に関するチュートリアルについては、「チュートリアル: WinUI 3 コントロールを使用して C# コンポーネントを作成し、C++ Windows App SDK アプリから使用する」を参照してください

前提条件

このチュートリアルでは、次のツールとコンポーネントが必要です。

C#/WinRT を使用して単純な Windows ランタイム コンポーネントを作成する

まず、Visual Studio で新しいプロジェクトを作成します。 [クラス ライブラリ] プロジェクト テンプレートを選択し、そのテンプレートに AuthoringDemo という名前を付けます。 プロジェクトに次の追加と変更を加える必要があります。

  1. AuthoringDemo.csproj ファイル内の TargetFramework を更新し、以下の要素を PropertyGroup に追加します。

    <PropertyGroup>
        <TargetFramework>net6.0-windows10.0.19041.0</TargetFramework>
        <Platforms>x64</Platforms>
    </PropertyGroup>
    

    Windows ランタイムの種類にアクセスするには、TFM で特定の Windows SDK バージョンを設定する必要があります。 サポートされているバージョンの詳細については、「.NET 6 以降: TFM オプションを使用する」を参照してください。

  2. Microsoft.Windows.CsWinRT NuGet パッケージをプロジェクトにインストールします。

    a. ソリューション エクスプローラーで、プロジェクト ノードを右クリックし、[NuGet パッケージの管理] を選択します。

    b. Microsoft.Windows.CsWinRT NuGet パッケージを検索し、最新バージョンをインストールします。 このチュートリアルでは、C#/WinRT バージョン 1.4.1 を使用します。

  3. CsWinRTComponent プロパティを設定する新しい PropertyGroup 要素を追加します。 これにより、プロジェクトをビルドするときに .winmd ファイルが生成されるように、プロジェクトが Windows ランタイム コンポーネントであることが指定されます。

    <PropertyGroup>   
        <CsWinRTComponent>true</CsWinRTComponent>
    </PropertyGroup>
    

    C#/WinRT プロジェクトのプロパティの完全な一覧は、C#/WinRT NuGet のドキュメントで参照してください。

  4. ライブラリ .cs クラス ファイルを使用して、ランタイム クラスを作成できます。 Class1.cs ファイルを右クリックし、Example.cs に名前を変更します。 このファイルに次のコードを追加します。これにより、パブリック プロパティとメソッドがランタイム クラスに追加されます。 ランタイム コンポーネントで公開するすべてのクラスは、必ず public としてマークしてください。

    namespace AuthoringDemo
    {
        public sealed class Example
        {
            public int SampleProperty { get; set; }
    
            public static string SayHello()
            {
                return "Hello from your C# WinRT component";
            }
        }
    }
    
  5. これで、プロジェクトをビルドして、コンポーネントの .winmd ファイルを生成できるようになりました。 ソリューション エクスプローラーでプロジェクトを右クリックし、[ビルド] をクリックします。 ビルド出力フォルダーに生成された AuthoringDemo.winmd ファイルが表示されます。

コンポーネントの NuGet パッケージを生成する

ほとんどの開発者は、Windows ランタイム コンポーネントを NuGet パッケージとして配布して共有したいと考えます。 もう 1 つのオプションは、コンポーネントをプロジェクト参照として使用することです。 次の手順では、AuthoringDemo コンポーネントをパッケージ化する方法を示します。 パッケージを生成すると、C#/WinRT によって、ネイティブ アプリケーションから使用できるように、パッケージ内のコンポーネントとホスティング アセンブリが構成されます。

NuGet パッケージを生成するには、いくつかの方法があります。

  • プロジェクトをビルドするたびに NuGet パッケージを生成する場合は、次のプロパティを AuthoringDemo プロジェクト ファイルに追加してから、プロジェクトをリビルドします。

    <PropertyGroup>
        <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
    </PropertyGroup>
    
  • 代わりに、ソリューション エクスプローラーAuthoringDemo プロジェクトを右クリックして [パック] を選択することにより、NuGet パッケージを生成することもできます。

パッケージをビルドすると、[ビルド] ウィンドウに、NuGet パッケージ AuthoringDemo.1.0.0.nupkg が正常に作成されたことが示されます。 .NET CLI を使用した NuGet パッケージのプロパティの詳細については、「dotnet CLI を使用してパッケージを作成する」を参照してください。

C++/WinRT アプリからコンポーネントを使用する

C#/WinRT で作成された Windows ランタイム コンポーネントは、任意の Windows ランタイム (WinRT) 互換言語から使用できます。 次の手順では、C++/WinRT コンソール アプリケーションで上記の作成済みコンポーネントを呼び出す方法を示します。

Note

C#/.NET アプリからの C#/WinRT コンポーネントの使用は、パッケージ参照とプロジェクト参照の両方でサポートされています。 このシナリオは、通常の C# クラス ライブラリを使用することと同じであり、ほとんどの場合、WinRT のアクティブ化には関係しません。 C#/WinRT 1.3.5 以降では、C# 使用者向けのプロジェクト参照には .NET 6 が必要です。

  1. 新しい C++/WinRT コンソール アプリケーションのプロジェクトをソリューションに追加します。 このプロジェクトを別のソリューションの一部にすることもできます。

    a. ソリューション エクスプローラーで、ソリューション ノードを右クリックし、[追加] - >[新しいプロジェクト] をクリックします。

    b. [新しいプロジェクトの追加] ダイアログ ボックスで、C++/WinRT コンソール アプリケーションのプロジェクト テンプレートを検索します。 テンプレートを選択して [次へ] をクリックします。

    c. 新しいプロジェクトに CppConsoleApp という名前を付け、[作成] をクリックします。

  2. NuGet パッケージまたはプロジェクト参照として、AuthoringDemo コンポーネントへの参照を追加します。

    • オプション 1 (パッケージ参照):

      a. CppConsoleApp プロジェクトを右クリックし、[NuGet パッケージの管理] を選択します。 AuthoringDemo NuGet パッケージへの参照を追加するには、パッケージ ソースを構成することが必要になる場合があります。 これを行うには、NuGet パッケージ マネージャーで [設定 アイコンをクリックし、パッケージ ソースを適切なパスに追加します。

      NuGet settings

      b. パッケージ ソース:の構成後、AuthoringDemo パッケージを検索して [インストール] をクリックします。

      Install NuGet package

    • オプション 2 (プロジェクト参照):

      a. CppConsoleApp プロジェクトを右クリックして、[追加] ->[参照] を選択します。 プロジェクト ノードの下で、AuthoringDemo プロジェクトへの参照を追加します。

  3. コンポーネントをホストするには、アクティブ化可能なクラス登録用のマニフェスト ファイルを追加する必要があります。 マネージド コンポーネントのホストの詳細については、「マネージド コンポーネントのホスト」を参照してください。

    a. マニフェスト ファイルを追加するには、プロジェクトを再び右クリックして、[追加] -> [新しい項目] を選択します。 テキスト ファイルのテンプレートを検索し、CppConsoleApp.exe.manifest という名前を付けます。 アクティブ化可能なクラス登録エントリを使用してランタイム クラスを指定する次の内容を貼り付けます。

    <?xml version="1.0" encoding="utf-8"?>
    <assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
        <assemblyIdentity version="1.0.0.0" name="CppConsoleApp"/>
        <file name="WinRT.Host.dll">
            <activatableClass
                name="AuthoringDemo.Example"
                threadingModel="both"
                xmlns="urn:schemas-microsoft-com:winrt.v1" />
        </file>
    </assembly>
    

    パッケージ化されていないアプリには、アプリケーション マニフェスト ファイルが必要です。 パッケージ アプリの場合、アプリ コンシューマーは、「チュートリアル: WinUI 3 コントロールを使用して C# コンポーネントを作成し、C++ Windows App SDK アプリケーションから使用する」で説明されているように、アクティブ化可能なクラスを Package.appxmanifest パッケージ マニフェスト ファイルに登録する必要があります。

    b. プロジェクトを配置するときに、出力にマニフェスト ファイルを含めるようにプロジェクトを変更します。 ソリューション エクスプローラーCppConsoleApp.exe.manifest ファイルをクリックし、[コンテンツ] プロパティを True に設定します。 次に例を示します。

    Deploy Content

  4. プロジェクトのヘッダー ファイルの下にある pch.h を開き、以下のコード行を追加して、コンポーネントが含まれるようにします。

    #include <winrt/AuthoringDemo.h>
    
  5. プロジェクトのソース ファイルの下にある main.cpp を開き、以下の内容で置き換えます。

    #include "pch.h"
    #include "iostream"
    
    using namespace winrt;
    using namespace Windows::Foundation;
    
    int main()
    {
        init_apartment();
    
        AuthoringDemo::Example ex;
        ex.SampleProperty(42);
        std::wcout << ex.SampleProperty() << std::endl;
        std::wcout << ex.SayHello().c_str() << std::endl;
    }
    
  6. CppConsoleApp プロジェクトをビルドして実行します。 次の出力が表示されます。

    C++/WinRT Console output