MSIXの製品名変更・多言語化で更新を壊さない|DisplayNameとIdentityの使い分け

MSIXでアプリの製品名を変更したり、日本語・英語などの多言語表示に対応したりする場合、既存アプリの更新として配布し続けたいなら、IdentityNamePublisherは変更しません。人が見る名称だけをProperties/DisplayNameuap:VisualElementsDisplayNameで変更します。

多言語化するときは、表示名にms-resource:参照を設定し、言語別の.reswファイルから文字列を読み込ませます。新しいMSIXパッケージではVersionを上げますが、パッケージファミリを決めるNamePublisherは維持するのが基本です。Microsoftも、Identityはシステム向け、DisplayNameはユーザー向けとして明確に使い分けるよう説明しています。(Microsoft for Developers)

目次

結論:Identityは固定し、表示上の製品名だけを変更する

MSIXのAppxManifest.xmlには、似たような名前の設定が複数あります。それぞれの役割は次のとおりです。

設定項目主な役割既存アプリの更新時
Identity/@Nameパッケージを識別する機械向け名称原則として変更しない
Identity/@Publisher発行元と署名を識別する値原則として変更しない
Identity/@Versionパッケージの更新順序を判断する値新版で増加させる
Properties/DisplayNameパッケージ全体の人向け表示名変更・翻訳できる
uap:VisualElements/@DisplayNameアプリのエントリに表示する名称変更・翻訳できる
PublisherDisplayNameユーザーに見せる発行元名変更・翻訳できる

重要なのは、Identity要素を一切変更しないという意味ではないことです。通常のアップデートではVersionを増やします。一方、同じ製品として更新を継続するため、NamePublisherは安定させます。

Microsoftのマニフェスト仕様でも、Identity/@Nameは大文字と小文字を区別する機械向け識別子であり、ユーザーに見せる名称にはDisplayNameを使うよう定義されています。また、Publisherはパッケージの署名に使う証明書のサブジェクト情報と一致させる必要があります。(Microsoft Learn)

IdentityのNameを変えると更新経路が壊れる理由

MSIXでは、パッケージのNameと発行元から算出されるPublisherIdを基に、Package Family Nameが作られます。

概念的には次の形式です。

<Name>_<PublisherId>

Package Family Nameは、バージョンが異なるパッケージを同じ製品系列として扱うための識別子です。パッケージの設定データやセキュリティ境界なども、通常はこのパッケージファミリを単位として扱われます。(Microsoft Learn)

MSIXの更新は、基本的に同じパッケージファミリ内で行われます。既存パッケージと同じNameおよびPublisherを維持し、新しいパッケージのVersionを上げることで、Windowsは新版を更新パッケージとして認識します。(Microsoft Learn)

たとえば、旧パッケージが次の設定だったとします。

<Identity
    Name="Contoso.Inventory"
    Publisher="CN=Contoso Software Ltd., O=Contoso Software Ltd., C=JP"
    Version="1.4.0.0"
    ProcessorArchitecture="x64" />

製品名を「Contoso Inventory」から「在庫管理 Pro」に変える際、次のようにNameまで変更すると、同じ製品の更新として扱われなくなります。

<!-- 更新経路を維持したい場合は避ける -->
<Identity
    Name="ZaikoKanriPro"
    Publisher="CN=Contoso Software Ltd., O=Contoso Software Ltd., C=JP"
    Version="1.5.0.0"
    ProcessorArchitecture="x64" />

Nameが変わるとPackage Family Nameも変わるため、Windowsから見ると別のパッケージです。環境や配布方式によっては、旧版とは別のアプリとして並行インストールされたり、更新処理が失敗したりします。

製品名を変えたいだけなら、IdentityではなくDisplayNameを変更するのが正しい対応です。

単一言語で製品名を変更する方法

多言語化が不要で、日本語の製品名に統一するだけなら、DisplayNameに直接文字列を記述できます。

IdentityのNameとPublisherを維持する

旧版が次の内容だった場合、NamePublisherはそのまま残します。

<Identity
    Name="Contoso.Inventory"
    Publisher="CN=Contoso Software Ltd., O=Contoso Software Ltd., C=JP"
    Version="1.5.0.0"
    ProcessorArchitecture="x64" />

変更するのはVersionです。旧版が1.4.0.0なら、新版を1.5.0.0など、通常はより大きい値にします。

PropertiesのDisplayNameを変更する

パッケージ全体の表示名は、Properties内のDisplayNameで設定します。

<Properties>
  <DisplayName>在庫管理 Pro</DisplayName>
  <PublisherDisplayName>Contoso Software</PublisherDisplayName>
  <Description>在庫と入出庫を管理するアプリ</Description>
  <Logo>Assets\StoreLogo.png</Logo>
</Properties>

Properties/DisplayNameは、ユーザーに見せるためのフレンドリーな名称として定義されており、ローカライズにも対応しています。(Microsoft Learn)

uap:VisualElementsのDisplayNameも確認する

MSIXパッケージには、パッケージ全体の表示名とは別に、アプリごとの表示名があります。

<uap:VisualElements
    DisplayName="在庫管理 Pro"
    Description="在庫と入出庫を管理するアプリ"
    BackgroundColor="transparent"
    Square150x150Logo="Assets\Square150x150Logo.png"
    Square44x44Logo="Assets\Square44x44Logo.png" />

uap:VisualElements/@DisplayNameは、スタートメニューなどに登録されるアプリの表示名として使われる設定です。1つのMSIXパッケージに複数のアプリが含まれる場合は、アプリごとに異なる名称を設定できます。(Microsoft Learn)

製品名を完全に切り替えたい場合は、次の両方を確認してください。

  • Properties/DisplayName
  • uap:VisualElements/@DisplayName

Properties/DisplayNameだけを変更すると、設定画面では新しい名前が表示されても、スタートメニューには旧名称が残る可能性があります。どのDisplayNameが使われるかはWindows上の表示場所によって異なるため、同じ製品名に統一する場合は両方をそろえるのが安全です。

製品名を多言語化する方法

日本語環境では「在庫管理 Pro」、英語環境では「Inventory Pro」と表示したい場合、マニフェストに名称を直接書き込むのではなく、ms-resource:参照を使用します。

AppxManifest.xmlをリソース参照に変更する

パッケージ側の表示名を次のように変更します。

<Properties>
  <DisplayName>ms-resource:Resources/PackageDisplayName</DisplayName>
  <PublisherDisplayName>ms-resource:Resources/PublisherDisplayName</PublisherDisplayName>
  <Description>ms-resource:Resources/PackageDescription</Description>
  <Logo>Assets\StoreLogo.png</Logo>
</Properties>

アプリ側の表示名もリソース参照にします。

<uap:VisualElements
    DisplayName="ms-resource:Resources/ApplicationDisplayName"
    Description="ms-resource:Resources/ApplicationDescription"
    BackgroundColor="transparent"
    Square150x150Logo="Assets\Square150x150Logo.png"
    Square44x44Logo="Assets\Square44x44Logo.png" />

ms-resource:Resources/PackageDisplayNameのうち、PackageDisplayName部分が.reswファイルのリソース名と対応します。名前は任意に決められますが、マニフェストと.reswで完全に一致させる必要があります。(Microsoft Learn)

言語別にResources.reswを配置する

代表的なフォルダー構成は次のとおりです。

PackageRoot
├─ AppxManifest.xml
├─ Assets
└─ Strings
   ├─ ja-JP
   │  └─ Resources.resw
   └─ en-US
      └─ Resources.resw

フォルダー名には、ja-JPen-USなどのBCP-47言語タグを使用します。

各言語のResources.reswには、同じリソース名を登録し、値だけを翻訳します。

リソース名ja-JPの値en-USの値
PackageDisplayName在庫管理 ProInventory Pro
ApplicationDisplayName在庫管理 ProInventory Pro
PackageDescription在庫管理パッケージInventory management package
ApplicationDescription在庫と入出庫を管理するアプリManage inventory and stock movements
PublisherDisplayNameContosoソフトウェアContoso Software

日本語版Resources.reswの関連部分は、次のようになります。

<data name="PackageDisplayName" xml:space="preserve">
  <value>在庫管理 Pro</value>
</data>

<data name="ApplicationDisplayName" xml:space="preserve">
  <value>在庫管理 Pro</value>
</data>

英語版では、同じnameに英語の値を設定します。

<data name="PackageDisplayName" xml:space="preserve">
  <value>Inventory Pro</value>
</data>

<data name="ApplicationDisplayName" xml:space="preserve">
  <value>Inventory Pro</value>
</data>

この構成なら、ユーザーの言語環境に応じて適切な文字列が選ばれます。該当する言語がない場合は、Windowsのリソース管理システムがフォールバック規則に従って利用可能な候補を選択します。IdentityのNamePublisherは、どの言語でも変わりません。(Microsoft Learn)

resources.priの生成を忘れない

.reswを配置しただけでは、手動パッケージング環境でリソースが自動的に解決されるとは限りません。ビルド時に.reswからresources.priを生成し、MSIXパッケージへ含める必要があります。

パッケージ作成方法対応
Visual Studioのパッケージプロジェクト通常はビルド時にPRIを生成する
手動パッケージングMakePRI.exeresources.priを生成する
MSIXを展開して直接編集再パッケージ化と再署名が必要
CI/CDで作成PRI生成工程がパイプラインに含まれているか確認する

手動の場合は、概ね次の流れになります。

  1. MakePRI createconfigで構成ファイルを作成する
  2. MakePRI newresources.priを生成する
  3. MakePRI dumpでリソース名と候補値を確認する
  4. MakeAppxでMSIXパッケージを再作成する
  5. SignToolなどでパッケージに署名する

Microsoftの手順でも、マニフェストのms-resource:参照と.reswを用意した後、PRIファイルを生成してMSIXへ含める流れが示されています。(Microsoft Learn)

インストール後に表示名ではなく、次のような文字列がそのまま表示された場合は、リソース解決に失敗しています。

ms-resource:Resources/ApplicationDisplayName

この場合は、次を確認してください。

  • Resources.reswのリソース名にスペルミスがないか
  • Resources/以降の名前が.reswnameと一致しているか
  • 言語フォルダーがja-JPなどの正しい形式か
  • resources.priが生成されているか
  • resources.priがMSIX内に含まれているか
  • 変更後のパッケージを再署名したか

ケース別の使い分け

製品名を変えるときは、目的によって変更対象が異なります。

目的Identity NamePublisherDisplayName
同じアプリの製品名変更維持維持変更
同じアプリの多言語化維持維持ms-resource:
ロゴやブランド表記だけ変更維持維持必要に応じて変更
旧版と新版を並行インストールする別製品新規設定を検討通常は維持新規設定
別会社による完全な別製品として配布新規設定新規設定新規設定
証明書更新に伴いPublisherが変わる個別の移行設計が必要個別対応任意

「新製品として旧製品と同時にインストールさせたい」という要件であれば、新しいIdentity/@Nameを使う選択肢があります。その場合は、既存製品の更新ではなく、別パッケージとして設計します。

反対に、名称変更後も既存ユーザーへ自動更新を届けたい場合は、新しい製品名をIdentityへ入れてはいけません。

PublisherとPublisherDisplayNameを混同しない

PublisherPublisherDisplayNameも役割が異なります。

<Identity
    Publisher="CN=Contoso Software Ltd., O=Contoso Software Ltd., C=JP"
    ... />

<Properties>
  <PublisherDisplayName>Contosoソフトウェア</PublisherDisplayName>
</Properties>

Publisherは、署名証明書とパッケージ識別に使われる機械向けの値です。証明書のサブジェクト情報と一致していないと、パッケージの署名やインストールで問題が発生します。PublisherDisplayNameはユーザーに見せる名称なので、日本語化やブランド表記の変更に利用できます。(Microsoft Learn)

会社名の変更などで表示上の発行元名だけを変える場合は、PublisherDisplayNameを変更します。署名証明書そのものが変わり、Identity/@Publisherの変更が必要になる場合は、単なる製品名変更とは別の移行案件です。

Microsoftは、新しい証明書で署名しながら旧パッケージの更新関係を維持するためのPersistent Identityも提供しています。ただし、旧証明書と新証明書の関係を証明する成果物の作成などが必要であり、DisplayName変更の代わりに気軽に使うものではありません。(Microsoft Learn)

App Installerを使っている場合の注意点

.appinstallerファイル経由で自動更新している場合は、MSIXだけでなくApp Installer側も確認します。

App Installerは、参照先MSIXのNamePublisherVersionが定義内容と一致しているか検証します。したがって、新版では通常、次のように対応します。

  • Nameは既存値を維持する
  • Publisherは既存値を維持する
  • Versionは新しいMSIXに合わせて更新する
  • 配布先URIが新版パッケージを指しているか確認する

MSIX側だけバージョンを上げ、.appinstaller側のVersionを更新し忘れると、インストールや更新の検証で失敗する可能性があります。(Microsoft Learn)

よくある失敗と修正方法

製品名に合わせてIdentity Nameを変更した

症状

  • 旧版から更新できない
  • 旧版と新版が別アプリとして表示される
  • Package Family Nameが変わった
  • 既存ユーザーの設定を引き継げない

修正

旧版と同じIdentity/@Nameへ戻し、製品名はDisplayNameで変更します。

PublisherDisplayNameと一緒にPublisherも変更した

症状

  • 署名エラーが発生する
  • インストール時に発行元不一致になる
  • 既存パッケージの更新として認識されない

修正

表示名の変更だけなら、PublisherDisplayNameだけを変更します。Identity/@Publisherは署名証明書と一致する旧値を維持します。

PropertiesのDisplayNameだけを変更した

症状

  • 設定画面では新しい名前になる
  • スタートメニューには古い名前が残る

修正

uap:VisualElements/@DisplayNameも確認し、必要に応じて同じ表示名または同じms-resource:参照へ変更します。

日本語名をマニフェストへ直接書いた

症状

  • 英語版Windowsでも日本語名が表示される
  • 言語ごとにパッケージを作り分ける必要が生じる

修正

DisplayNamems-resource:参照へ変更し、言語別のResources.reswを用意します。

Versionを上げなかった

症状

  • 同じバージョンが既にインストールされていると判断される
  • 通常の更新としてインストールできない

修正

Identity/@Versionを旧版より大きい値へ変更し、再ビルドします。

クリーンインストールだけで確認した

クリーンインストールに成功しても、旧版からの更新経路が維持されているとは限りません。

必ず次の順番でテストします。

  1. 旧製品名のMSIXをインストールする
  2. アプリを起動して設定やデータを保存する
  3. 新製品名のMSIXを更新インストールする
  4. 同じアプリとして置き換わったことを確認する
  5. 保存した設定やデータが残っていることを確認する

更新前に確認するチェックリスト

公開前には、次の項目を確認してください。

  • Identity/@Nameが旧版と完全に一致している
  • Identity/@Publisherが旧版と完全に一致している
  • Publisherが署名証明書のサブジェクトと一致している
  • Identity/@Versionが旧版より大きい
  • Properties/DisplayNameが新しい製品名になっている
  • uap:VisualElements/@DisplayNameも確認した
  • 多言語化する場合はms-resource:参照になっている
  • 各言語のResources.reswに同じリソース名がある
  • resources.priがパッケージに含まれている
  • 旧版から新版への上書き更新を実際に試した
  • App Installerを使う場合は、そのVersionも更新した
  • スタート、設定、インストール画面で表示名を確認した

パッケージファミリが維持されているかは、PowerShellでも確認できます。

Get-AppxPackage -Name "Contoso.Inventory" |
    Format-List Name, PackageFamilyName, PackageFullName, Version, Publisher

更新前後でPackageFamilyNameが同じで、Versionだけが増えていれば、同じパッケージ系列として更新できている可能性が高いと判断できます。

なお、製品名を「在庫管理 Pro」に変えても、Get-AppxPackageNameにはContoso.Inventoryが表示されます。これは失敗ではありません。PowerShellのNameはユーザー向け製品名ではなく、機械向けのパッケージIdentityを表示しているためです。

DisplayNameとIdentityの判断基準

MSIXの製品名変更では、「どの文字列を新しいブランド名に合わせるか」ではなく、その値を人が使うのか、Windowsが識別に使うのかで判断します。

同じアプリの名称変更や翻訳であれば、次の方針で進めます。

  • Identity/@NamePublisherは維持する
  • Versionは新版で増加させる
  • 人向けの名称はDisplayNameで変更する
  • スタート表示も変えるならuap:VisualElements/@DisplayNameを確認する
  • 多言語化にはms-resource:.reswを使う
  • 旧版からの更新テストでPackage Family Nameの維持を確認する

Identityは製品名を入れる場所ではなく、Windowsがパッケージを継続的に識別するための値です。リブランドや多言語化によってユーザー向けの名前が変わっても、同じ製品として更新を続ける限り、機械向けのIdentityは安定させる必要があります。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次