次の方法で共有


ウォークスルー―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. TargetFramework ファイル内の を更新し、次の要素を PropertyGroupに追加します。

    <PropertyGroup>
        <TargetFramework>net8.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. PropertyGroup プロパティを設定する新しい CsWinRTComponent 要素を追加します。 プロジェクトをビルドするときに .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 プロジェクトを右クリックし、 Packを選択して、NuGet パッケージを生成することもできます。

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

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

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

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 設定

      b。 パッケージ ソースを構成したら、AuthoringDemo パッケージを検索し、[インストール]をクリックします。

      NuGet パッケージ をインストールする

    • オプション 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>
    

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

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

    コンテンツ の展開をする

  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 コンソールの出力