書いてみるといいつつFred Emmott(fredemmott)さんのサンプルを動かしてみます。
https://github.com/fredemmott/cmake-cpp-winrt-winui3 を clone します。
(checkout された master のhash はd6c0454ead1 でした。)
とりあえず cmake を走らせます。clone した cmake-cpp-winrt-winui3
のディレクトリに移動し、cmake -Bbuild .
を実行します。(build
ディレクトリ以下に関連ファイルを生成する)
残念ながらCMake のエラーが発生しました。
CMake Error at src/CMakeLists.txt:15 (add_custom_target):
Error evaluating generator expression:
$<TARGET_RUNTIME_DLLS:DemoApp>
Expression did not evaluate to a known generator expression
CMake の TARGET_RUNTIME_DLLS
は 3.21 からサポートされてるとのこと。手元のCMake は 3.20 だったので、少し古かったです。
cmake_minimum_required(VERSION 3.20)
と指定されていますが、正しくは 3.21 ですね。というわけで CMake 3.21 に更新して cmake を再実行します。今度は通りました。
折角なのでビルドまで進めます
cmake --build build
でビルドします。
特に問題なくビルドが通り、build/src/DemoApp.exe
が生成されました。
これを実行しますが、Windowが表示される前に終了してしまいました。
どうも初期化時の下記のコードで ::MddBootstrapInitialize()
が失敗しています。
const HRESULT hr{ ::MddBootstrapInitialize(c_majorMinorVersion, c_versionTag, c_minVersion) };
if (FAILED(hr))
{
exit(hr);
}
実行時に Windows App SDK フレームワーク パッケージを参照する には以下のように記述されています。
アプリが展開テクノロジに msix を使用していない場合 (スパースパッケージまたはアンパッケージ化されている場合)、Windows app sdk の機能 (WinUI 3、app ライフサイクル、mrt.dll Core、および DWriteCore) を呼び出す前に、使用するために Windows app sdk を初期化する必要があります。 Windows App SDK 1.0 安定版では、プロジェクトのビルドの一部として初期化に必要なコードを生成するプロジェクトプロパティ None を設定できます。 これにより、msix を使用していないアプリは、実行時に Windows App SDKフレームワークパッケージに対する依存関係を取得できます。
このプロジェクトではmsix は使っておらず、フレームワークの初期化を自力で行っており、その初期化処理でエラーとなっていました。
MddBootstrapInitializeあたりをキーに検索すると、
Unpackaged C++ sample app MddBootstrapInitialize call reports unhandled exception in KernelBase.dll というissue が見つかりました。
Unpackaged なアプリの場合は別途 WindowsAppRuntimeInstall.exe を使ってランタイムをインストールする必要があるそうです。
We should probably update the docs for MddBootstrapInitialize to point to this too, and provide a better error message (or at least debug output).
と言われていますし、エラーメッセージは要改善ですね。
何はともあれ、
https://docs.microsoft.com/en-us/windows/apps/windows-app-sdk/downloads
から今使っているWindows App SDKは 1.0.0 に対応する Redistributable をダウンロードします。
そうすると、Microsoft.WindowsAppRuntime.Redist.1.0.0.zip という名前のファイルが降ってきました。
zip 内には WindowsAppSDK-Installer-x64/WindowsAppRuntimeInstall.exe
があるので、これを実行してランタイムをインストールします。
再度build/src/DemoApp.exe
を実行すると、、、
無事起動しました!
ということで、CMake のみでWinUI3 App を動かせることが確認できました