C#/WinRT を使用すると、.NETを使用する開発者は、クラス ライブラリ projectを使用して C# で独自のWindows Runtime コンポーネントを作成できます。 作成されたコンポーネントは、ネイティブ デスクトップ アプリケーションでパッケージ参照として、またはいくつかの変更を加えたproject参照として使用できます。
このチュートリアルでは、C#/WinRT を使用して単純なWindows Runtime コンポーネントを作成し、そのコンポーネントを NuGet パッケージとして配布し、C++/WinRT コンソール アプリケーションからコンポーネントを使用する方法について説明します。 この記事のコードを提供する完全なサンプルについては、C#/WinRT 作成サンプルを参照してください。 作成の詳細については、「オーサリングコンポーネント」を参照してください。
Windows App SDK アプリケーションで特に使用する C#/WinRT を使用した WinUI 3 コントロールの作成に関するチュートリアルについては、「Walkthrough: WinUI コントロールを使用して C# コンポーネントを作成し、C++ Windows App SDK アプリケーションから使用する」を参照してください
[前提条件]
このチュートリアルでは、次のツールとコンポーネントが必要です。
- Visual Studio 2022
- .NET 6.0 SDK 以降
- C++/WinRT プロジェクトテンプレート用のC++/WinRT VSIX
C#/WinRT を使用して単純なWindows Runtime コンポーネントを作成する
まず、Visual Studioで新しいprojectを作成します。 Class Library project テンプレートを選択し、project AuthoringDemo という名前を付けます。 projectに次の追加と変更を加える必要があります。
TargetFrameworkファイル内の を更新し、次の要素をPropertyGroupに追加します。<PropertyGroup> <TargetFramework>net8.0-windows10.0.19041.0</TargetFramework> <Platforms>x64</Platforms> </PropertyGroup>Windows Runtime 型にアクセスするには、TFM で特定の Windows SDK バージョンを設定する必要があります。 サポートされているバージョンの詳細については、「.NET 6 以降: TFM オプションを使用するを参照してください。
projectに Microsoft.Windows.CsWinRT NuGet パッケージをインストールします。
a. Solution Explorerで、project ノードを右クリックし、 Manage NuGet パッケージを選択します。
b。 Microsoft.Windows.CsWinRT NuGet パッケージを検索し、最新バージョンをインストールします。 このチュートリアルでは、C#/WinRT バージョン 1.4.1 を使用します。
PropertyGroupプロパティを設定する新しいCsWinRTComponent要素を追加します。 これにより、projectがWindows Runtime コンポーネントであり、.winmdファイルがprojectのビルド時に生成されるように指定されます。<PropertyGroup> <CsWinRTComponent>true</CsWinRTComponent> </PropertyGroup>C#/WinRT project プロパティの完全な一覧については、
C#/WinRT NuGet のドキュメント. ライブラリ
.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"; } } }projectをビルドして、コンポーネントの
.winmdファイルを生成できるようになりました。 Solution Explorer のprojectを右クリックし、Build をクリックします。 生成されたAuthoringDemo.winmdファイルがビルド出力フォルダーに表示されます。
コンポーネントの NuGet パッケージを生成する
ほとんどの開発者は、Windows Runtime コンポーネントを NuGet パッケージとして配布して共有したいと考えています。 もう 1 つのオプションは、コンポーネントをプロジェクト参照として利用することです。 次の手順では、AuthoringDemo コンポーネントをパッケージ化する方法を示します。 パッケージを生成すると、C#/WinRT は、ネイティブ アプリケーションからの使用を可能にするために、パッケージ内のコンポーネントとホスティング アセンブリを構成します。
NuGet パッケージを生成するには、いくつかの方法があります。
projectをビルドするたびに NuGet パッケージを生成する場合は、AuthoringDemo project ファイルに次のプロパティを追加し、projectをリビルドします。
<PropertyGroup> <GeneratePackageOnBuild>true</GeneratePackageOnBuild> </PropertyGroup>または、
Solution Explorer で AuthoringDemo project を右クリックし、Pack を選択して NuGet パッケージを生成することもできます。
パッケージをビルドすると、ビルド ウィンドウに、NuGet パッケージ AuthoringDemo.1.0.0.nupkg が正常に作成されたことを示す必要があります。 .NET CLI での NuGet パッケージのプロパティの詳細については、「 dotnet CLI を使用してパッケージを作成する」を参照してください。
C++/WinRT アプリからコンポーネントを使用する
C#/WinRT で作成されたWindows Runtime コンポーネントは、任意のWindows Runtime (WinRT) 互換言語から使用できます。 次の手順では、C++/WinRT コンソール アプリケーションで上記の作成済みコンポーネントを呼び出す方法を示します。
注
C#/.NET アプリからの C#/WinRT コンポーネントの使用は、パッケージ参照とproject参照の両方でサポートされています。 このシナリオは、通常の C# クラス ライブラリを使用することと同じであり、ほとんどの場合、WinRT のアクティブ化は含まれません。 C#/WinRT 1.3.5 以降では、C# コンシューマーのproject参照には .NET 6 が必要です。
新しい C++/WinRT コンソール アプリケーション projectをソリューションに追加します。 このprojectを選択すると、別のソリューションの一部になる場合もあります。
a. Solution Explorer で、ソリューション ノードを右クリックし、Add ->New Project をクリックします。
b。 [新しいProjectの追加] ダイアログ ボックスで、C++/WinRT コンソール アプリケーション project テンプレートを検索します。 テンプレートを選択し、[次へ]をクリックします。
c. 新しい project CppConsoleApp に名前を付け、Create をクリックします。
NuGet パッケージまたは project 参照として AuthoringDemo コンポーネントへの参照を追加します。
オプション 1 (パッケージ リファレンス):
a. CppConsoleApp project を右クリックし、 Manage NuGet パッケージを選択します。 AuthoringDemo NuGet パッケージへの参照を追加するようにパッケージ ソースを構成する必要がある場合があります。 これを行うには、NuGet Package Manager の Settings アイコンをクリックし、適切なパスにパッケージソースを追加します。
b。 パッケージ ソースを構成したら、AuthoringDemo パッケージを検索し、[インストール]をクリックします。
をインストールするOption 2 (プロジェクト参照):
a. CppConsoleApp project を右クリックし、 Add ->Reference を選択します。 Projects ノードで、AuthoringDemo project への参照を追加します。
コンポーネントをホストするには、アクティブ化可能なクラス登録用のマニフェスト ファイルを追加する必要があります。 マネージド コンポーネントホスティングの詳細については、「Managed コンポーネントホスティング」を参照してください。
a. マニフェスト ファイルを追加するには、もう一度projectを右クリックし、Add -> New Item を選択します。 テキスト ファイル テンプレートを検索し、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>パッケージ化されていないアプリには、アプリケーション マニフェスト ファイルが必要です。 パッケージ アプリの場合、アプリ consumerは、
Package.appxmanifestパッケージ マニフェスト ファイルにアクティブ化可能なクラスを登録する必要があります。詳細については、「Walkthrough: WinUI コントロールを使用して C# コンポーネントを作成し、C++ Windows App SDK アプリケーションから使用する。b。 projectを配置するときに出力にマニフェスト ファイルを含むようにprojectを変更します。
Solution Explorer のCppConsoleApp.exe.manifest ファイルをクリックし、 Content プロパティをTrue に設定します。 この例を次に示します。
の展開をするprojectのヘッダー ファイルの下にある pch.h を開き、コンポーネントを含める次のコード行を追加します。
#include <winrt/AuthoringDemo.h>projectのソース ファイルの下にある 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; }CppConsoleApp project をビルドして実行します。 次の出力が表示されます。
関連トピック
Windows developer