Desktop App Converterで自作ゲームをUWP化したときのメモ

> 本記事の内容を[はてなブログ](https://nanmo.hateblo.jp/entry/2016/10/23/000000)に転記しました。
> すぐにQiitaの記事を削除する予定はありませんが、どちらか一方だけ残すとなったらはてなブログの方を残すと思います。
> ご承知おき下さい。

※Desktop App Converterの基本情報は[Desktop App Converter(マイクロソフトのドキュメント)](https://msdn.microsoft.com/en-us/windows/uwp/porting/desktop-to-uwp-run-desktop-app-converter)などをお読みください。

自作ゲームの[トルクル(TorqueL)](http://TorqueL.net)のWindows版をDesktop App ConverterでUWPに変換して、Windowsストアで配信できるように作業した際のメモです。

* [配信しているWindowsストアページへのリンク https://www.microsoft.com/store/apps/9nblggh4xzwh](https://www.microsoft.com/store/apps/9nblggh4xzwh)

# 注意

DACで変換したアプリのWindowsストアへの配信については現在個別に権限・許可が必要です。
Windowsストアへの配信を考える方は全文を一通り読んでから手を付けることをお勧めします。

また、このメモではDAC正式公開当初ドキュメントがろくに揃ってなかったので過去のドキュメントを漁ったりして無理やり進めました。
気がついたら最近更新されたみたいなので、そちらも参照してください。
[Desktop App Converter](https://msdn.microsoft.com/en-us/windows/uwp/porting/desktop-to-uwp-run-desktop-app-converter) (ズラッと並んでるソフトの更新履歴の下の方に色々書いてあります)

# Desktop App Conveterのインストール

Windows Store(Windowsストアアプリ版): https://aka.ms/converter
ZIP版(PowerShell版?): https://www.microsoft.com/en-us/download/details.aspx?id=53896 (後述する作業用ベースイメージも同URLから落とせます)

このメモではWindowsストアアプリ版をインストールして作業を進めています。
また、一部でDesktop App ConverterをDACと略して記述しています。

# Windows 10 SDK (Windows Kits) のインストール
Desktop App Conveterの実行に必要なのでWindows 10 SDKをインストールします。

ダウンロード場所: https://developer.microsoft.com/en-us/windows/downloads/windows-10-sdk

# ベースイメージのダウンロード
https://www.microsoft.com/en-us/download/details.aspx?id=53896 にあるイメージのうち、
Desktop App Converterを実行するマシンと同じビルド番号のベースイメージ(wim)をダウンロードし、適当なフォルダに置きます。(DesktopAppConverter作業用のディレクトリを作って放り込んでおくと楽だと思います)

# DAC用インストーラの作成

Desktop App Conveterは、ベースイメージ上の仮想Windowsでインストーラを実行し、その実行内容をトレースすることでUWP化を行います。
そのため、インストーラがサイレントインストール可能であることが必要になります。

インストーラがコマンドライン引数でサイレントインストール可能な場合はDesktop App Conveter側でその引数を指定します。
今回は利用している[簡単インストーラ](http://www5a.biglobe.ne.jp/~nobukich/index_j.htm)がコマンドライン引数ではサイレントインストール不可のようだったので、サイレントインストール用のインストーラを作成します。

行った作業は以下のとおりです。

 * サイレントインストール用のオプションを有効にする
 * OS判別を行わないようにオプションを変更(変換時にそこで止まる)
 * 不要なファイル・インストール内容の除去
 * 実行ファイルへのショートカット作成はそのままにする(ショートカットを作らないとDACが実行ファイルを認識してくれない)

※元となるインストーラ・インストール内容は数年前に作った物理パッケージ用のものだったので、内容を一部差し替えたりもしています。

> そのほかにもDesktop App ConverterによるUWP化にはいくつか制限があります、制限については [Behind the scenes of the Desktop to UWP Bridge](https://msdn.microsoft.com/en-us/windows/uwp/porting/desktop-to-uwp-behind-the-scenes) をご確認ください

# DACによる変換
Desktop App Conveterで以下のコマンドを実行します。

Desktop App Conveterを「管理者として実行」し、以下のコマンドを実行します。(以下、DACは常に管理者として実行します)

> DesktopAppConverter.exe -Setup -BaseImage [BaseImageFile] -Verbose

セットアップが途中で終わり、OS再起動を求められることがあります。
この場合は再起動後再度セットアップを実行すると完了します。(コンテナ機能のON/OFFに再起動が必要らしい)

なお、ベースイメージのセットアップは以下のインストーラー実行前に毎回行うのが良さそうです。

> DesktopAppConverter.exe -Installer [InstallerEXE] -Destination [DestinationDir] -PackageName [PackageName] -Publisher "CN=[PublisherName]" -Version [VersionNumber] -MakeAppx -Verbose

※自動的に証明書の作成と署名を行う `-Sign` というオプションがありますが、後の作業を考えると手動で証明書の作成と署名を行うようにしたほうが良さそうです。 

問題なく実行できれば、[DesktinationDir]の[PackageName]のディレクトリにパッケージングされたのappx(UWP)ファイルとパッケージング前のファイルとなるPackagesFiles、そしてログが出力されます。

このappxは署名されていないため、この状態ではインストールできません。

# appxへの署名・ローカルでのインストール

Windows 10 SDK (Windows Kits)に含まれるMakeCert,Pvk2Pfx,SignToolを使用します。インストール先のbinにパスを通しておくと楽だと思います。

参考: [Sign your converted desktop app \| MSDN](https://msdn.microsoft.com/en-us/windows/uwp/porting/desktop-to-uwp-signing)

> MakeCert.exe -r -h 0 -n "CN=[PublisherName]" -eku 1.3.6.1.5.5.7.3.3 -pe -sv [my.pvk] [my.cer]

パスワードは `None` を選択します。

> pvk2pfx.exe -pvk [my.pvk] -spc [my.cer] -pfx [my.pfx]

> signtool.exe sign -f [my.pfx] -fd SHA256 -v [AppXFile]

インストールしたいマシンで以下の作業を行います。

 * 「設定」の「開発者向け」を「開発者モード」または「サイドロードアプリ」に切り替える。
 * 署名したAppXのプロパティから「デジタル署名」タブで署名を選択し、「詳細」、「証明書の表示」「証明書のインストール」で保存場所を「ローカルコンピューター」、証明書をすべて次のストアに配置するで [信頼されたルート証明機関] > [証明書] ノードまたは[信頼されたユーザー] > [証明書] ノードのどちらかに配置

これで署名したAppX(UWP)がローカルでインストール可能となります。

※当然元になった証明書などをインストールしても同様のことが可能だと思いますが、運用上はこれが一番確実と思います。

# Windowsストアでの配信に向けての作業

DACによって書き出されたPackageFilesを再利用することでWindowsストアで配信できる形にしていきます。
ストアに出すためには、[Windowsデベロッパーセンター](https://developer.microsoft.com/ja-jp/windows)での開発者登録手続きが完了していることが前提になります。

基本的な作業は

 * (PackageFiles内の)AppManifest.xml を適切な内容に修正する
 * AppManifest.xml にかけた修正に合わせて必要なファイルを用意する
 * PackagesFiles から手動でappxを作成・署名する

になります。

AppManifest.xml内の一部内容は(表示されるアプリ名)などはローカライズが可能なのですが、少しややこしいのと必要ないという方もいるかもしれませんので、後回しにしています。

## AppManifest.xmlの修正

以下の項目とオプションをWindowsデベロッパーのダッシュボードのアプリIDの値に合わせて修正します。

 * identityタグのNameとPublisher 
 * Propertyタグの子のPublisherDisplayName

Propertyタグ内のDisplayNameタグは予約しているアプリ名を使用します(ローカライズするならのローカライズ後のアプリ名も同様に予約しておく)

identityタグのVersionはドット区切りの4つの番号で表記であればどう使うかは基本自由なようです。(アップデートを配信・インストールするのであればバージョン番号が上がっている必要はある)
ただし、Windowsストアに提出するものに関しては4つ目の数字(リビジョン番号)が0である必要があるようです。

アプリのアイコンは

 * AssetsにあるPNGをそのまま書き換える
 * Assetsフォルダに新たにPNGファイルを配置してxml内のサンプルのPNGを指定している個所を修正

のいずれかで対応します。

(※DACが出力するAppManifest.xmlで指定されるアイコンは44x44,50x50,150x150の3種類なのですが、理想はもっといろんなサイズのアイコンがあったほうがいいらしいです。今回は面倒くさく感じたので増やす作業はやりませんでした: [タイルとアイコン アセット](https://msdn.microsoft.com/ja-jp/windows/uwp/controls-and-patterns/tiles-and-notifications-app-assets))

## 手動appxパッケージング

> MakeAppx pack /d PackageFiles /p [OutputAppxPackageFileName]

## 署名

ローカル用に行ったのと同じ作業ですが、証明書作成時のCNがAppManifest.xmlで編集したパブリッシャーのCN(=ダッシュボードのCN)と一致していないと[エラーが出て署名できません](https://msdn.microsoft.com/en-us/windows/uwp/porting/desktop-to-uwp-signing#publisher-and-cert-mismatch-causes-signtool-error-error-signersign-failed--21470248850x8007000b)。

そのため、大抵の場合は証明書を改めて生成する必要が出てきます。ほぼ同じ作業ですが、以下にコマンドを記載しておきます。

> MakeCert.exe -r -h 0 -n "CN=[PublisherName]" -eku 1.3.6.1.5.5.7.3.3 -pe -sv [my.pvk] [my.cer]

パスワードは `None` を選択します。

> pvk2pfx.exe -pvk [my.pvk] -spc [my.cer] -pfx [my.pfx]

> signtool.exe sign -f [my.pfx] -fd SHA256 -v [AppXFile]

ローカルでテストしたいときの手順も同様です。

## MSからのコンタクト

と、作業していると、以前登録しておいた[Desktop Bridge Sign Up Form](https://developer.microsoft.com/en-us/windows/projects/campaigns/desktop-bridge)からWindows App Consultチームからコンタクトがありました。いくつか条件はありますが、直接質問できるようになりました。

## ストアのローカライズ(?)

AppManifest.xmlのResourcesタグ以下で該当言語を記載しておくとダッシュボード上で言語による表示切り替え(ローカライズ)ができるそうです。

``` xml:AppManifest.xml
<Resources>
    <Resource Language="ja-jp" />
    <Resource Language="en-us" />
</Resources>
```

確かにパッケージをアップロードが完了後、登録情報の言語にパッケージで指定した言語が自動的に登録されます
この時、先に登録情報を記述していた言語でも別言語として追加されるようです。

![2016-10-11_17h39_14.png](https://qiita-image-store.s3.amazonaws.com/0/37548/7ded70ba-a86e-6569-eda2-3d1306a482e4.png)

ただ、自動的に追加される言語設定だとアプリ名が変更できない状態(AppManifest.xml内で記述が必要?)で都合が悪かったので、
今回はリソースを追加せずにストアで日本語設定をしました。

なお、アプリ内のローカライズはまた別の話のようです。(今回は必要ないので特に作業していません)

## パッケージのアップロード

ダッシュボードのアプリ申請からパッケージファイルをアップロードしたとき、以下のエラーではじかれることがあります。

> パッケージ受領の検証エラー: パッケージ [パッケージファイル名] の appx マニフェスト ファイルで次の名前空間を指定するアクセス許可がありません: http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities
> パッケージ受領の検証エラー: Your developer account doesn’t have permission to submit apps converted with the Desktop App Converter at this time.

これはパッケージそのものの問題ではなく、開発者アカウントの権限の問題のようです。
なんでも、DACでパッケージングするアプリは権限が非常に強い(Capability runFullTrust)ため、現時点では許可制になっており、アプリの概要などを伝えて権限つけてもらう必要があるようです。(概要とはいっても、先方へのメリットを示す売り上げやユーザー数などの話もあったほうがいいみたいです。)

今回は先に書いた[Desktop Bridge Sign Up Form](https://developer.microsoft.com/en-us/windows/projects/campaigns/desktop-bridge)からのコンタクトがあったので、Windows App Consultチームに相談しました。(なんでも通るわけではないそうです。)

# ログインするたびにベースイメージのセットアップが走るトラブル

Desktop App Converterで今回の一連の作業を行ったPCについて、サインインするたびにPowershellが立ち上がりベースイメージのセットアップが行われるようになりました。
どうやら、ベースイメージの初期セットアップ(再起動を要求するところ)で設定される "SetupDesktopAppConverter" というタスクが何らかの事情で実行後に削除されなかったようです。

タスクスケジューラーから該当のタスクを削除してからベースイメージのセットアップをやり直してみたところ、タスクを一度実行したあとにタスクは削除されていました。

発生条件は不明ですが、こういうこともあるようです。

# 参考(再掲含む)
 * [Desktop App Converter](https://msdn.microsoft.com/en-us/windows/uwp/porting/desktop-to-uwp-run-desktop-app-converter)
 * [Behind the scenes of the Desktop to UWP Bridge](https://msdn.microsoft.com/en-us/windows/uwp/porting/desktop-to-uwp-behind-the-scenes)
 * [変換済みのデスクトップ アプリに署名する \| MSDN](https://msdn.microsoft.com/ja-jp/windows/uwp/porting/desktop-to-uwp-signing)
 * [Windows デスクトップ アプリケーションから変換したユニバーサル Windows プラットフォーム \(UWP\) アプリを展開してデバッグする](https://msdn.microsoft.com/ja-jp/windows/uwp/porting/desktop-to-uwp-deploy-and-debug)
 * [アプリ パッケージ マニフェスト \- Windows app development](https://msdn.microsoft.com/ja-jp/library/windows/apps/br211474.aspx)
 * [Windows 8\.1 ストア アプリ: アプリについてユーザーに説明する情報のローカライズ](https://msdn.microsoft.com/ja-jp/library/windows/apps/hh454044.aspx)
 * [Manually convert a Windows desktop application to a Universal Windows Platform \(UWP\) app](https://msdn.microsoft.com/en-us/windows/uwp/porting/desktop-to-uwp-manual-conversion)
 * [App packager \(MakeAppx\.exe\) \(Windows\)](https://msdn.microsoft.com/en-us/library/windows/desktop/hh446767(v=vs.85).aspx#create_package_using_dir)
 * [Desktop Bridge Sign Up Form \- Windows app development](https://developer.microsoft.com/en-us/windows/projects/campaigns/desktop-bridge)