このガイドでは、C++ アプリケーションで winapp CLI を使用してパッケージ ID でデバッグし、アプリケーションを MSIX としてパッケージ化する方法について説明します。
パッケージ ID は、Windows app モデルの主要な概念です。 これにより、アプリケーションで特定の Windows API (通知、セキュリティ、AI API など) をaccessしたり、クリーン インストール/アンインストール エクスペリエンスを使用したりできます。
標準の実行可能ファイル ( cmake --build で作成されたものなど) にはパッケージ ID がありません。 このガイドでは、デバッグ用に追加し、配布用にパッケージ化する方法を示します。
[前提条件]
ビルド ツール: CMake でサポートされているコンパイラ ツールチェーンを使用します。 この例では、Visual Studioを使用します。 コミュニティ エディションは、次の方法でインストールできます。
winget install --id Microsoft.VisualStudio.Community --source winget --override "--add Microsoft.VisualStudio.Workload.NativeDesktop --includeRecommended --passive --wait"インストール後に再起動します。
CMake: CMake をインストールします。
winget install Kitware.CMake --source wingetwinapp CLI: winget を使用して
winappCLI をインストールします。winget install Microsoft.winappcli --source winget
1. 新しい C++ アプリを作成する
まず、単純な C++ アプリケーションを作成します。 projectの新しいディレクトリを作成します。
mkdir cpp-app
cd cpp-app
基本的な "Hello, world!" プログラムを使用して、 main.cpp ファイルを作成します。
#include <iostream>
int main() {
std::cout << "Hello, world!" << std::endl;
return 0;
}
ビルドを構成する CMakeLists.txt ファイルを作成します。
cmake_minimum_required(VERSION 3.20)
project(cpp-app)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
add_executable(cpp-app main.cpp)
ビルドして実行して、すべてが動作していることを確認します。
cmake -B build
cmake --build build --config Debug
.\build\Debug\cpp-app.exe
2. ID を確認するようにコードを更新する
Windows Runtime C++ API を使用して、アプリがパッケージ ID で実行されているかどうかを確認するようにアプリを更新します。
まず、CMakeLists.txt を更新して、Windows App モデル ライブラリにリンクします。
cmake_minimum_required(VERSION 3.20)
project(cpp-app)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
add_executable(cpp-app main.cpp)
# Link Windows Runtime libraries
target_link_libraries(cpp-app PRIVATE WindowsApp.lib OneCoreUap.lib)
次に、 main.cppの内容を置き換えます。
#include <iostream>
#include <windows.h>
#include <appmodel.h>
int main() {
UINT32 length = 0;
LONG result = GetCurrentPackageFamilyName(&length, nullptr);
if (result == ERROR_INSUFFICIENT_BUFFER) {
std::wstring familyName;
familyName.resize(length);
result = GetCurrentPackageFamilyName(&length, familyName.data());
if (result == ERROR_SUCCESS) {
std::wcout << L"Package Family Name: " << familyName.c_str() << std::endl;
} else {
std::wcout << L"Error retrieving Package Family Name" << std::endl;
}
} else {
std::cout << "Not packaged" << std::endl;
}
return 0;
}
3. ID なしで実行する
アプリをリビルドして実行します。
cmake --build build --config Debug
.\build\Debug\cpp-app.exe
"パッケージ化されていません" と表示されます。 これにより、標準の実行可能ファイルがパッケージ ID なしで実行されていることが確認されます。
4. winapp CLI を使用してprojectを初期化する
winapp init コマンドは、アプリ マニフェスト、アセット、必要に応じて C++ 開発用の Windows App SDK ヘッダーなど、必要なものをすべて設定します。
winapp init
プロンプトが表示されたら、次を実行します。
- パッケージ名: Enter キーを押して既定値をそのまま使用します (cpp-app)
- Publisher名: Enter キーを押して既定値をそのまま使用するか、名前を入力します
- バージョン: Enter キーを押して 1.0.0.0 を受け入れる
- エントリポイント: Enterキーを押してデフォルト (cpp-app.exe) を受け入れます。
- Setup SDK: "Stable SDK" を選択してWindows App SDKをダウンロードし、ヘッダーを生成します
このコマンドを実行すると、次のものが作成されます。
- アプリのID用のフォルダー
appxmanifest.xmlAssets - Windows App SDK ヘッダーとライブラリを含む
.winappフォルダー - SDK バージョンをピン留めするための
winapp.yaml構成ファイル
5. ID を使用したデバッグ
アプリを完全にパッケージ化せずに ID を必要とする機能をテストするには、 winapp create-debug-identityを使用します。
実行可能ファイルをビルドします。
cmake --build build --config Debugデバッグ ID を適用します。
winapp create-debug-identity .\build\Debug\cpp-app.exe実行可能ファイルを実行します。
.\build\Debug\cpp-app.exe
次のような出力が表示されます。
Package Family Name: cpp-app_12345abcde
デバッグ ID の自動化 (省略可能)
ビルド後のコマンドを CMakeLists.txt に追加して、デバッグ ID を自動的に適用します。
add_custom_command(TARGET cpp-app POST_BUILD
COMMAND $<$<CONFIG:Debug>:winapp>
$<$<CONFIG:Debug>:create-debug-identity>
$<$<CONFIG:Debug>:$<TARGET_FILE:cpp-app>>
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
COMMAND_EXPAND_LISTS
COMMENT "Applying debug identity to executable..."
)
6. Windows App SDKの使用 (省略可能)
winapp init中に SDK のセットアップを選択した場合は、.winapp/include フォルダーにある Windows App SDK のヘッダーにアクセスできます。
ヘッダーを含むように CMakeLists.txt を更新します。
# Add Windows App SDK include directory
target_include_directories(cpp-app PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/.winapp/include)
Windows App ランタイム API を使用するように main.cpp を更新します。
#include <iostream>
#include <windows.h>
#include <appmodel.h>
#include <winrt/Microsoft.Windows.ApplicationModel.WindowsAppRuntime.h>
int main() {
winrt::init_apartment();
UINT32 length = 0;
LONG result = GetCurrentPackageFamilyName(&length, nullptr);
if (result == ERROR_INSUFFICIENT_BUFFER) {
std::wstring familyName;
familyName.resize(length);
result = GetCurrentPackageFamilyName(&length, familyName.data());
if (result == ERROR_SUCCESS) {
std::wcout << L"Package Family Name: " << familyName.c_str() << std::endl;
auto runtimeVersion = winrt::Microsoft::Windows::ApplicationModel::WindowsAppRuntime::RuntimeInfo::AsString();
std::wcout << L"Windows App Runtime Version: " << runtimeVersion.c_str() << std::endl;
}
} else {
std::cout << "Not packaged" << std::endl;
}
return 0;
}
7. 必要に応じヘッダーを復元する
.winapp フォルダーが自動的に.gitignoreに追加されます。 他のユーザーがprojectを複製するときは、次のファイルを復元する必要があります。
winapp restore
winapp cert generate --if-exists skip
8. MSIX を使用したパッケージ
配布する準備ができたら、MSIX としてパッケージ化します。
リリース用のビルド:
cmake --build build --config Releaseパッケージ ディレクトリを準備します。
mkdir dist copy .\build\Release\cpp-app.exe .\dist\開発証明書を生成します。
winapp cert generate --if-exists skipパッケージと署名:
winapp pack .\dist --cert .\devcert.pfx証明書をインストールします (管理者として実行)。
winapp cert install .\devcert.pfxインストールして実行します。
Add-AppxPackage .\cpp-app.msix cpp-app
ヒント
- 実稼働配布用の証明機関のコード署名証明書を使用して MSIX に署名します。
- Microsoft Store は MSIX に署名します。提出前に署名する必要はありません。
- サポートするアーキテクチャ (x64、Arm64) ごとに個別の MSIX パッケージが必要になる場合があります。
関連トピック
Windows developer