かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

Windows ストアへ自分の Win32 アプリを上げる Desktop Bridge

変更履歴

  • 2017/10/05 paint.net について追記
  • 2017/10/06 msi 形式のインストーラーという表記をインストーラーに変更(msi である必要はなかったので)

やってみよう!

WPF とかで作ったアプリは、そのままではストアから配布できません。 ストア対応したかったら UWP でアプリを作りましょう!!というのが一応基本スタンスです。 (UWP が現状流行ってるのかは置いておいて、Windows 10 ネイティブなアプリケーション開発は UWP でやるのが一応第一選択肢です)

まぁそうはいっても…という状況で活躍するのが Desktop Bridge ですね。ということで見てみましょう。

Desktop Bridge

ドキュメントがしっかりしてるので、そこを見るのが正です。

デスクトップ ブリッジ - UWP app developer | Microsoft Docs

まだ、にわかなので間違ってること書いてるかもしれませんが、登場当初は msi 形式のインストーラを appx に変換するぜ!みたいな雰囲気で登場したと思います。まぁでも、実態は AppxManifest.xml がちゃんとあって、exe を同梱して appx にパッケージングすればストアに上げることが出来るっぽいですね。

ちなみに、Desktop Bridge で変換したものをストアに上げたい!って思ってる人はここのフォームから申請するとプロセスがスタートします。

Desktop Bridge Sign Up Form - Windows app development

Desktop App Converter

Desktop App Converter を使うと、簡単にインストーラーや実行形式の exe を appx にパッケージングしてくれたり AppxManifest.xml を生成してくれます。便利なので、まずはこれを足掛かりにやってみるのがいいのかなと感じています。

セットアップは Desktop App Converter をストアから仕入れて自分の OS のバージョンとあった BaseImage をダウンロードしてきてコマンドを叩くという感じです。ここらへんに書いてあります。(BaseImage のダウンロードはインストーラーを Desktop App Converter で変換するときに使うのでインストーラーじゃない場合はいらないですね)

Desktop App Converter を使用してアプリをパッケージ化する (デスクトップ ブリッジ) - UWP app developer | Microsoft Docs

注意点としてアップデートをきちんとあてている Creators Update の Windows 10 を使ってると対応する BaseImage-15063 を入れるのではなく BaseImage-15063-UPDATE というのを入れないとダメってところですかね。

zip で配ってる感じのアプリを変換してみよう

つまり、よくあるフリーソフトみたいな感じのやつですね。 インストーラーがない形式です。zip をダウンロードして任意の場所に展開して、その中にある exe を起動する感じで使うアプリになります。

例えば DacApp フォルダ以下に DacApp.exe というファイルがあって、それを実行すれば動くアプリの場合は以下のようなコマンドで appx にできます。

DesktopAppConverter.exe -Installer .\DacApp -AppExecutable DacApp.exe -Destination c:\Work\dacsample-noinstaller\Output -PackageName "DacApp" -Publisher "CN=okazuki" -Version 0.0.0.1 -MakeAppx -Sign -Verify

パラメータの意味は以下を参照するといいです。

Desktop App Converter を使用してアプリをパッケージ化する (デスクトップ ブリッジ) - UWP app developer | Microsoft Docs

インストーラー形式のアプリを変換してみよう

とりあえず WPF のアプリを作って Microsoft Visual Stduio 2017 Instalelr Projects を入れてセットアッププロジェクトを作って msi 形式にパッケージングしてみました。別に msi 形式じゃなくてもサイレントインストール可能なら何でもいいです。

この Installer Projects で作った msi 形式のインストーラーは /qn 引数でサイレントインストールできるみたいなので、Desktop App Converter のマニュアルに従い以下のようなコマンドをぱちぱちと叩くことで appx にパッケージングして適当な証明書で署名してくれます。

DesktopAppConverter -Installer .\DacApp.Setup.msi -InstallerArguments "/qn" -Destination .\Output
-PackageName DacApp -Publisher "CN=okazuki" -Version 0.0.0.2 -MakeAppx -Sign -Verify

マニュアルはこちら。(再掲)

Desktop App Converter を使用してアプリをパッケージ化する (デスクトップ ブリッジ) - UWP app developer | Microsoft Docs

インストールして実行してみよう

こんな感じのものが Output フォルダの下に作られます。

f:id:okazuki:20171005224615p:plain

生成された appx はダブルクリックすることでさくっとインストールできそうな雰囲気を醸し出しつつ失敗します。これはローカル コンピューターの信頼されたルート証明機関に auto-generated.pfx をインストールしてやる必要があります。やですね。 インストールの過程でパスワードを求められるのですが、これは 123456 になります。

証明書をインストールしたら気を取り直して appx を起動するとこんな感じの画面が出ます。

f:id:okazuki:20171005224924p:plain

インストール後起動するとこんな感じ。

f:id:okazuki:20171005225043p:plain

いいね!!

再パッケージ

Desktop App Converter での変換は毎回しなくてもよくて、なんかインストール時に書き込むレジストリが変わっただとかいう影響のでかい変更しない限りは必要ないみたいです。

では、どうやって appx を作るのか?ですが makeappx.exe を使ってやります。

docs.microsoft.com

出力先として指定したフォルダに PackageFiles というフォルダが出来てるので、そこのファイルを更新したら makeappx.exe で appx に固めるといった感じです。makeappx.exe は以下のフォルダにあるのでパスを通しておくとスムーズかもしれません。

  • x86: C:\Program Files (x86)\Windows Kits\10\bin\x86\makeappx.exe
  • x64: C:\Program Files (x86)\Windows Kits\10\bin\x64\makeappx.exe

こんなコマンドで再パッケージングできます。

makeappx.exe pack /d .\PackageFiles /p DacApp.appx /l

appx が出来たらインストールできるように署名しましょう。署名はここにドキュメントがあります。

docs.microsoft.com

Desktop App Converter が生成してくれる auto-generated.pfx を使う場合は以下のようなコマンドで OK です。

signtool sign /fd SHA256 /a /f .\auto-generated.pfx /p 123456 .\DacApp.appx

Windows 10 S でのテストも忘れずに

これは Desktop Bridge の要件ではなく Windows ストアの要件なんですが Windows 10 S で動くことが必須みたいですね。

デスクトップ ブリッジ - UWP app developer | Microsoft Docs

Windows ストアにアプリを公開する場合は、Windows 10 S を実行するデバイスでアプリが正しく動作することを確認してください。これは、ストア要件です。 「Windows アプリの Windows 10 S 対応をテストする」をご覧ください。

Windows 10 S ですがサイドローディング禁止です。じゃぁどうやってテストするの?ということになりますが、Windows 10 Pro になんかポリシーみたいなのあてて疑似的にやる感じみたいですね。

ちなみに仮想マシンでやることを強くおすすめされてます。(まぁ普通のアプリインストールできなくなるしね…)

Test your Windows app for Windows 10 S - UWP app developer | Microsoft Docs

具多的にはダウンロードできる zip の SiPolicy_DevModeEx_Enforced.p7b を SiPolicy.p7b にリネームして C:\Windows\System32\CodeIntegrity において再起動するだけみたいですね。

そうすると、zip に同梱されてる AppxTestRootAgency.pfx で署名した appx がインストールできるようになるみたいです。署名するにあたり AppxManifest.xml の書き換えが必要です。

Identity の Publisher を CN=Appx Test Root Agency Ex にする必要があります。例えば私の場合 Desktop App Converter で okazuki としたので CN=okazuki と記載されています。

  <Identity Name="DacApp" ProcessorArchitecture="x64" Publisher="CN=okazuki" Version="0.0.0.1" />

こんな感じにします。

  <Identity Name="DacApp" ProcessorArchitecture="x64" Publisher="CN=Appx Test Root Agency Ex" Version="0.0.0.1" />

そしたら makeappx.exe で appx にパッケージングします。そして signtool で署名しておきます。

makeappx.exe pack /d .\PackageFiles /p DacApp.appx /l
signtool sign /fd SHA256 /a /f .\AppxTestRootAgency.pfx .\DacApp.appx

ポリシーあてた Windows 10 Pro でも無事インストールして起動できました。

f:id:okazuki:20171005233953p:plain

ちなみに、AppxTestRootAgency.pfx 以外の証明書で署名した appx を用意して pfx を信頼されたルート証明機関に追加するとインストールまでは成功しますが起動しようとすると以下のような感じになります。

f:id:okazuki:20171005234916p:plain

まとめ

とりあえず Desktop Bridge の入り口である変換の部分を紹介しました。Desktop Bridge 自体は秀丸エディタさんがストアで公開されたりとかされてて熱い感じですね。

秀まるおのホームページ(サイトー企画)−秀丸エディタ(ストアアプリ版)

長い目で見ると Pure な UWP なんでしょうが、とりあえず現実問題として exe 形式のアプリを抱えてる人は UWP 化へのとっかかりとして Desktop Bridge で appx にしてしまうのもありじゃないでしょうか。

あ、因みにもとが exe なので Windows.Desktop でしか動かないです。

追記

Paint.net もいつの間にかストアで配布されてた!!すごい!

blog.getpaint.net