MSIXとは、MSIの後継となるパッケージ形式です。
アプリケーションのインストール ディレクトリには書き込めません。代わりに%LOCALAPPDATA%以下などに保存します。デスクトップ アプリケーションのパッケージ化の準備 (MSIX) - MSIX | Microsoft Learn
UWPでは既定のプロジェクトからMSIXパッケージを作成できますが、デスクトップ アプリでは別途パッケージ用のプロジェクトが必要です。
新しいプロジェクトとして[Windows アプリケーション パッケージ プロジェクト]を追加します。そのときこれが存在しないならば、Visual Studioのインストーラから【.NET デスクトップ開発 → オプション】などにある[MSIX Packaging Tools]をインストールします。必要な Visual Studio のバージョンとワークロード - Visual Studio を使用してソース コードからデスクトップ アプリをパッケージ化する - MSIX | Microsoft Learn
プロジェクトは.wapprojファイルとして作成されますが、その実体はMSBuild プロジェクト ファイルです。
なお既定のプロジェクト名として表示される"WapProjTemplate"は、おそらく"Windows Application Packaging Project template"の意味です。Required Visual Studio version and workload - Package a desktop app from source code using Visual Studio - MSIX | Microsoft Learn
プロジェクトの作成時に「この種類の Windows 用アプリを開発するには、このデバイスを正しく設定する必要があります。そうでない場合は、Windows Store に提出する前にアプリをインストールしてテストすることはできません。」「デバイスで 開発者向けの設定 にアクセスし、[開発者モード] を選択します。」と表示されるならば、そのリンクから開発者モードを有効にします。そのとき「開発者モードをオンにすると、Microsoft Store 以外からアプリをインストールして実行する場合などに、デバイスと個人データがセキュリティ上のリスクにさらされる可能性や、デバイスに問題が起こる可能性があります。」と警告され、Storeに提出前のアプリをテストできるようになります。この開発者モードは、[設定]の【システム → 開発者向け】から無効できます。
サポート対象とするプラットフォームの最小バージョンは、アプリケーションが依存するAPIなどから決定します。UWP バージョンの選択 - UWP applications | Microsoft Learn
配布方法を[サイドローディング]として自動更新を有効にするならば、最小バージョンを「Windows 10, version 1803 (10.0; ビルド 17134)」以降とします。visual studio - Automatic updates are not available for the configured target platform min version - Stack Overflow
パッケージ プロジェクトの依存関係に、対象とするプロジェクトを追加します。
パッケージ プロジェクトをビルドし、エラーのないことを確認します。
パッケージ プロジェクトに含まれるアプリ マニフェスト ファイル (Package.appxmanifest) を開きます。そこではアイコンや署名を設定できます。プロジェクトを構成する - MSIX アプリのパッケージ化 - MSIX | Microsoft Learn
このファイルの実体はパッケージ マニフェスト ファイル (package manifest file) であり、XMLとして編集できます。MSIX パッケージ コンポーネントの生成 - MSIX | Microsoft Learn
これらの設定はインストーラや設定アプリに作用するものであり、実行ファイルに対しては別に設定が必要です。
項目 | 作用 |
---|---|
表示名 (Display name) | スタートメニューや、[設定]のインストールされているアプリで表示される名前 |
エントリ ポイント (Entry Point) | |
既定の言語 (Default language) | |
説明 (Description) | |
信頼レベル (Trust level) |
|
サポートされる回転 |
多言語対応させるならば、それらをリソース ファイル (.resw) で定義しms-resource URIスキームで参照します。 アプリ パッケージ マニフェストの文字列リソース識別子を参照する - UI とアプリ パッケージ マニフェスト内の文字列をローカライズする - UWP applications | Microsoft Learn 文字列を多言語化対応するには?[Win 8]:WinRT/Metro TIPS - @IT 山本康彦 (2012/11/01)
それにはパッケージ プロジェクトに次のようにフォルダを作成して、言語ごとのリソース ファイルを作成します。
Strings/en-US/Resources.resw Strings/ja-JP/Resources.resw
そしてそれぞれに同名のリソースを追加して、そのニュートラル値にそれぞれの言語の文字列を設定します。または同一のフォルダに
Resources.lang-en-US.resw Resources.lang-ja-JP.resw
のように言語ごとの名前を付けてファイルを作成し、追加したリソースの言語ごとに文字列を設定します。
リソースの定義を誤ると「エラー 0x80073B17: *** 文字列リソースをローカライズできるかどうかを確認しているときに次のエラーが発生したため、*** パッケージを登録できません: NamedResource が見つかりません。文字列リソースが定義されていることと、このパッケージに含まれる resources.pri ファイルで少なくとも 1 つのインスタンスが定義されていることを確認してください。」として失敗します。
たとえば名前を"AppName"としたリソースを表示名に適用するには、その定義を"ms-resource:AppName"とします。
このように定義した言語は、設定の優先する言語を変更することで、適用されることを確認できます。
作成したリソース ファイルが適用されないときには、そのプロパティを開き[項目の種類]が"リソース"であることを確認します。
Resources.altform-msft-phonetic.reswのように名付けたリソース ファイルを作成し、そこで定義します。並べ替えることができる日本語文字列のふりがなのサポート - アプリをローカライズ可能にする - Windows apps | Microsoft Learn
Strings/ja-JP/Resources.resw Strings/ja-JP/Resources.altform-msft-phonetic.resw
"希蒼"の名前にふりがなを設定しないと"ま"の位置に並ぶとドキュメントでは解説されていますが、Windows 11 24H2では設定しなくても"の"の位置に並び、ふりがなの指定は無視されます。
アプリのアイコンなどを指定します。
アイコンには16x16、24x24、32x32、48x48、256x256のサイズが必要です。Windows アプリのアイコンを作成する - Windows apps | Microsoft Learn
アイコンの設計 (Design) は、アプリの概念が伝わるものとします。Windows アプリ アイコンの設計ガイドライン - Windows apps | Microsoft Learn
アイコンの背景を透明にしていると、インストーラーで表示されるアイコンの背景がWindowsのアクセントカラーになることがあります。[BUG] The installation wizard displays a blue background color beneath the app icon. · Issue #258 · YehudaKremer/msix · GitHub
ここでチェックした項目が、[機能]としてインストーラで表示されます。
<Capabilities> <Capability Name="internetClient" /> <rescap:Capability Name="runFullTrust" /> </Capabilities>
アプリ機能の宣言 - UWP applications | Microsoft Learn
Microsoft Storeでの承認を得るのに、追加の情報を必要とする機能です。 制限付き機能 - アプリ機能の宣言 - UWP applications | Microsoft Learn
Win32などDesktop Bridgeを用いるアプリケーションが必要とする、"runFullTrust"と呼ばれる機能です。そして完全信頼 (full trust) なアプリケーションではuap10:TrustLevelがmediumILに設定され、中程度の整合性レベルで実行されるプロセスがあります。 A simpler and faster way to publish your Desktop Bridge applications on the Microsoft Store | Microsoft Learn 制限付き機能の一覧 - アプリ機能の宣言 - UWP applications | Microsoft Learn
この機能を必要とする場合は、Storeでの申請時に「The following restricted capabilities require approval before you can use them in your app: runFullTrust.」と警告されます。
次のような宣言をできます。
項目 | 作用 |
---|---|
パッケージ名 (Package name) | C:\Program Files\WindowsAppsにインストールされるときの、フォルダ名の先頭の文字列 |
パッケージ表示名 (Package display name) | インストーラで表示される「パッケージ表示名 をインストールしますか?」のパッケージ表示名 |
バージョン (Version) | インストーラおよび[設定]のインストールされているアプリで表示される、バージョン番号 |
公開者 (Publisher) | インストーラで表示される、発行元 |
公開者表示名 (Publisher display name) | [設定]のインストールされているアプリで表示される、発行元 |
パッケージ ファミリ名 (Package family name) | %LOCALAPPDATA%\Packagesに作成されるアプリのフォルダ名 |
パッケージ ID (Package identity) は名前、バージョン、アーキテクチャ、ResourceId、公開元の5つの要素から構成される識別子です。パッケージ ID とは - Windows アプリのパッケージ ID の概要 - Windows apps | Microsoft Learn
パッケージ名には、英数字と「-」「.」しか使用できません。これに反すると「error APPX0501: 検証エラー。error C00CE169: App manifest validation error: The app manifest must be valid as per schema: Line **, Column **, Reason: '***' が、'[-.A-Za-z0-9]+' の 'pattern' 制約に違反しています。 値 '***' を持つ属性 'Name' を解析できませんでした。」としてエラーとなります。
Microsoft Storeでは、"発行元表示名.アプリ名"がパッケージ名となります。
公開者は空白にできません。これに反すると「error APPX0501: 検証エラー。error C00CE169: App manifest validation error: The app manifest must be valid as per schema: Line **, Column **, Reason: '' が、'1' の 'minLength' 制約に違反しています。 値 '' を持つ属性 'Publisher' を解析できませんでした。」としてエラーとなります。
[証明書の選択]から、証明書を適用できます。そのときアプリケーションがMicrosoft Storeに関連づけられているならば[ストアから選択]を、さもなくば[作成]から[発行者共通名]にパッケージ IDの発行元 (publisher ID) を設定して作成します。
パッケージ ファミリ名は、実行時にはPackageId.FamilyNameから取得できます。 PackageId.FamilyName プロパティ (Windows.ApplicationModel) - Windows apps | Microsoft Learn c# - Is there a way to find the PackageFamilyName at runtime? - Stack Overflow
パッケージ ファミリ名 - Windows アプリのパッケージ ID の概要 - Windows apps | Microsoft Learnソリューション エクスプローラーでパッケージ プロジェクトのコンテキストメニューを開き、【公開 → アプリ パッケージの作成】を実行します。
Microsoft Storeを経由せずインストールできるようにするには、配布方法を[サイドローディング (Sideloading)]とします。 基幹業務アプリのサイドロード | Microsoft Learn サイドローディング | 日経クロステック(xTECH) 井原敏宏 (2014/04/18)
そのときパッケージ プロジェクトがサポート対象とするプラットフォームの最小バージョンがビルド17134より前だと「構成されたターゲット プラットフォームの最小バージョンでは、自動更新を利用できません。(Automatic updates are not available for the configured Target Platform Minimum Version.)」として、自動更新を有効にできません。
Microsoft Storeで配布するには[新しいアプリ名で Microsoft Store に]を選択します。ストアと関連付けられると、Package.StoreAssociation.xmlが作成されます。
[アプリケーション名を選択]で「予期しないネットワーク エラーが発生しました。アプリ一覧を取得できません。[最新の情報に更新] ボタンを押してもう一度お試しください。(An unexpected network error has occurred. The app list cannot be retrieved. Retry by pressing the Refresh button.)」として、アプリ名の取得に失敗することがあります。この問題が発生したときは、次のように対処します。
新しいバージョンは、つねに大きな数字のバージョンとなるようにします。これに反するとインストール時に「このパッケージの新しいバージョンが既にインストールされています。こちらの古いパッケージを代わりにインストールするには、現在システムにあるパッケージをアンインストールしてください (0x80073D06)」としてインストールに失敗します。
[自動的に増加]をチェックするか、大きな数字のバージョン番号を付けないと、アプリを更新しても適用されません。そのときは[再インストール]を実行しても同じバージョンがインストールされるため、アンインストールしてからインストールし直します。
ただしVisual Studioでパッケージ プロジェクトを配置 (デプロイ) するときは、バージョン番号を増加させる必要はありません。
アプリ バンドル (.msixbundleまたは.appxbundleファイル) を利用すると、必要なリソースのみをダウンロードさせるようにできます。アップバンドル - MSIX アプリのアプリ パッケージ要件 - Windows apps | Microsoft Learn
この.msixbundleや.appxbundleも、.msixや.appx同様に複数のファイルがZIPで書庫化 (archive) された形式のため、抽出する (extraction) ことで内容を確認できます。
アーキテクチャの[Neutral]はすべてのアーキテクチャで動作する場合に指定するもので、それ以外とは排他です。 アプリ パッケージのアーキテクチャ - MSIX | Microsoft Learn パッケージ ID のプロセッサ アーキテクチャについて - Windows アプリのパッケージ ID の概要 - Windows apps | Microsoft Learn
[インストーラーの場所]には、オンラインで公開するならばそのURL、ローカルならばパッケージの出力場所などのパスを指定します。
アプリ パッケージを作成すると、パッケージの出力場所に*_TestフォルダとAPPINSTALLER ファイル (.appinstaller) が作成されます。同時に作成されるHTMLファイルの[アプリを取得する]は、このファイルへのリンクとなっています。アプリ インストーラー ファイルの概要 - MSIX | Microsoft Learn
アプリ パッケージとして作成されたAppPackages/index.htmlを開き、そこにある[アプリを取得する]のリンクからインストールする方法です。
このリンク先となっているms-appinstallerプロトコルからは、アプリ インストーラーが1.21.3421.0以降だと「ms-appinstaller プロトコルが無効になっています。Web リンクを更新するようにベンダーに依頼してください。詳細については、aka.ms/ms-appinstaller-disabled を参照してください。」としてインストールできません。 Microsoft、「ms-appinstaller」プロトコルハンドラーを既定で無効化 ~マルウェアの標的に - 窓の杜 樽井秀人 (2024/01/12) Why has the ms-appinstaller protocol been disabled? - Microsoft Q&A
*.appinstallerファイルを実行してインストールする方法です。
インストール画面で「このアプリ パッケージの発行元証明書を検証できませんでした。確認済みの証明書を含む新しいアプリ パッケージを取得するには、システム管理者またはアプリ開発者に問い合わせてください。アプリ パッケージ内の署名のルート証明書とすべての即時証明書を確認する必要があります (0x800B010A)」として[インストール]ボタンがグレーアウトして実行できないならば、先に証明書をインストールします。アプリ パッケージ署名エラーのトラブルシューティング方法 - Win32 apps | Microsoft Learn
証明書を用意していないならば、[アプリ パッケージの作成]のウィザード、またはPackage.appxmanifestの[パッケージ化]タブの[証明書の選択]で作成できます。
証明書をインストールするには、アプリ パッケージに含まれるセキュリティ証明書 (.cerファイル) のコンテキストメニューを開き、[証明書のインストール]を実行します。そして保存場所を[ローカル コンピューター]として、[証明書をすべて次のストアに配置する]を選択し[信頼されたユーザー (Trusted People)]を指定します。
この証明書のインストールは、certlm.msc (コンピューター証明書の管理) からも実行できます。そこでは【証明書 → 信頼されたユーザー → 証明書】のコンテキストメニューを開き、【すべてのタスク → インポート】を選択します。そしてセキュリティ証明書 (.cerファイル) を指定し、証明書ストアが[信頼されたユーザー]であることを確認してインポートします。そのとき「ストアが読み取り専用か、ストアがいっぱいか、ストアが正しく開かなかったため、インポートができませんでした。」として失敗するならば、certlm.mscを管理者権限で実行します。信頼できる証明書 - アプリ インストーラー ファイルを使ったインストールに関する問題のトラブルシューティング - MSIX | Microsoft Learn
証明書を正しくインストールできたならば、[インストール]ボタンからインストールできます。またインストールされた証明書は、certlm.mscを実行し【証明書 → 信頼されたユーザー → 証明書】で確認や削除をできます。
「アプリをインストールできませんでした。エラー メッセージ: appinstaller URI ***.appinstallerは既に別のパッケージによって使用されているため、関連付けが削除されるまでパッケージ *** に適用できません。 (0x80004005)(App installation failed with error message: The appinstaller uri ***.appinstaller is already being used by another package and cannot be applied to package *** until the association is removed. (0x80004005))」
Get-AppxPackageでインストールされているアプリの一覧を取得し、そこにインストールできないアプリが含まれているならばRemove-AppxPackageで先にアンインストールします。FilesのInsider Previewをアップデートできない問題 - ろぼいんブログ Erro ao Instalar Arc - Microsoft Community
解決できないならば、パッケージ プロジェクトを作成し直します。
既定ではC:\Program Files\WindowsApps\package_full_nameにインストールされ、そこに置かれたファイルは読み取り専用になります。このC:\Program Files\WindowsAppsはPackageVolumeと呼ばれ、設定から変更されることがあります。インストール - Windows でパッケージ化されたデスクトップ アプリが動作するしくみについて - MSIX | Microsoft Learn
依存ファイルがパッケージ外にある場合には、それがパッケージ内のVFS (Virtual File System/仮想ファイル システム) フォルダ内に配置されます。そして例えばC:\Windows\System32\vc10.dllへのアクセスがC:\Program Files\WindowsApps\package_full_name\VFS\SystemX86\vc10.dllにリダイレクトされます。
レジストリ内の必要な情報は、PackageVolume以下のregistry.datに格納され参照されます。
ローカルで動作確認するだけならば、Visual Studioのソリューション エクスプローラーでパッケージ プロジェクトのコンテキストメニューを開き、[配置]を実行するだけでプロジェクトのフォルダに実行ファイルなどが作成され、システムにインストールされます。
そのとき先にMSIXでインストールしていると「アプリケーション "***" は既にこのコンピューターにインストールされています。現在の配置を続行する場合、既存のアプリケーションはアンインストールされ、アプリケーションの現在の状態は削除されます。」と警告され、逆に後からMSIXでインストールするときは「アプリをインストールできませんでした。エラー メッセージ: 現在のユーザーが、このアプリのパッケージ化されていないバージョンを既にインストールしています。これをパッケージ化されたバージョンに置き換えることはできません。競合するパッケージは ***、その発行元は CN=*** です。 (0x80073cfb)」と警告され失敗します。
インストール先はパッケージ プロジェクトの出力パスで指定されている場所であり、bin\x64\Release\AppX\ProjectNameのようなパスです。
インストールに成功しているはずなのに起動しないときは、アプリケーション側の問題である可能性が高いです。そのとき何もエラーが表示されないならば、イベントビューアーでエラーが記録されていないか確認します。