デスクトップ アプリの生存戦略 (Desktop App Converter)

先日開催された「めとべや東京」改め「まどすた」の 1 回目の勉強会が //build/ 2016 振り返りをテーマとして C# ユーザー会と合同で開催され、私は Project Centennial (Desktop App Converter) を題材として、以下の資料で発表しました。

また、5/23 に開催された de:code 前夜祭のアンカンファレンスでも、この資料の一部を使用しつつ 20 分ほど発表させて頂きました

本記事は、これらの発表を準備するにあたった実施した Project Centennial のセットアップ、および実行手順と、Project Centennial の登場によりデスクトップ アプリ開発者にとってどのような変化があるかについてを共有することを目的としています。

余談ですが、発表タイトルに「// 2016」と入っているのは、およそ 3 年前の「めとべや東京」の第 1 回勉強会でも同じタイトルで登壇しており、要するになんとなくです。

Project Centennial

昨年の //build/ 2015 で、様々なプラットフォーム向けの既存アプリを Windows 10 (UWP) に移行させることを目的とした Windows Bridge が発表されました。 Project Centennial は、その一環として Windows Bridge for Classic Desktop app として登場したもので、既存の Windows デスクトップ (Win32 / .NET) アプリを UWP パッケージ化するものです。

デスクトップ アプリのインストーラーをサイレント モードで動作させて、UWP アプリ パッケージである AppX に変換するのがこのツールの主機能です。 既存のデスクトップ アプリを「UWP アプリと同じようにパッケージ化する」だけであり、実行されるバイナリは従来通りのものである (つまり、既存のコード ベースそのままで UWP アプリを作れるわけではないし、この方法で UWP パッケージ化したデスクトップ アプリは Windows 10 Mobile などでは動作しない) ことに注意してください。

Desktop App Converter の利用方法や得られるメリット等は本記事の後半に記述してあります。

昨年の //build/ 以降、大きな情報のアップデートがなく、その間に同じく Windows Bridge の一部として登場した Project Astoria が終了したりしており、Project Centennial の存続を (勝手に) 危ぶんでいたりしましたが、今年の //build/ 2016 で「Desktop App Converter」として開発が継続していることが判り、ほっとした次第です。

その Desktop App Converter は、//build/ 2016 の数日後にリリースされた Windows 10 Insider Preview build 14316 で Preview 版を利用できるようになりました。 本記事はその際に公開された Desktop App Converter Preview (Project Centennial) の内容に沿ってセットアップ等を行っています。 実際に試す場合は、こちらの記事も参照することを推奨します。

当初は Windows 10 Enterprise が Desktop App Converter Preview の必須要件として挙げられていましたが、5/21 時点の最新ビルドである 14342 から Windows 10 Pro でも利用できるようになり、セットアップのハードルは下がったと言えるでしょう。

現時点では、以下を満たした環境が必要です。 ハードウェア要件については、最近のミドルレンジ以上の CPU であれば特に問題ないはずです。

Supported operating system

  • Windows 10 Anniversary Update Enterprise edition preview (Build 10.0.14342.0 and later)

Required hardware configuration

  • 64 bit (x64) processor
  • Hardware-assisted virtualization
  • Second Level Address Translation (SLAT)

セットアップ

以下のリンクからイメージと Desktop App Converter をダウンロードしてください。

Download Desktop App Converter Preview (Project Centennial) from Official Microsoft Download Center

zip ファイルは C ドライブに展開することを推奨します (UWP 全般的に C ドライブ以外に配置するとうまくいかない例をいくつも耳にしているのと、14316 時点で C ドライブ以外で試していたら失敗したため)。 展開の前に代替データ ストリーム (Zone ID) を削除することを忘れないようにしてください (いわゆる「ブロックの解除」)。

以下のようなファイル群が展開されます。 BaseImage-nnnnn.wim を配置する場所はどこでもよさそうですが、私は同じフォルダーに放り込みました。

Desktop App Converter files

展開したら、管理者権限で起動した PowerShell で以下を実行します。 パスは適宜読み替えてください。 OS の再起動を促された場合は、再起動したうえで再度上記コマンドを実行してください。

ちなみに、私はセットアップ時に「ネットワーク アダプターを作成できない」エラーが出て失敗しましたが、ネットワーク アダプターを全削除したところセットアップできました。 ご参考まで (参考にならない)。

AppX への変換

先述のとおり、Desktop App Converter はデスクトップ アプリのインストーラーを使って AppX を生成します。 //build/ 2016 のデモでは Evernote のインストーラーを使用していましたので、本記事でも同様に Evernote のインストーラーをダウンロードして使用します。

セットアップ時と同様に管理者権限で起動した PowerShell で以下を実行してください。 パラメーターが多いので、PowerShell ISE を使ったほうが楽かと思います。

-ExpandedBaseImage は、ダウンロードしたイメージ ファイルではなくセットアップによって展開されたイメージであることに注意してください。 -Installer には Evernote のインストーラーのパスを設定し、-InstallerArguments はインストーラーへ渡す引数で、主にサイレント モードで動作させたりするのに使用します (当然、インストーラーによって異なります)。

-Destination は変換したファイルの出力先です (C ドライブ推奨)。 -AppExecutable は、インストーラーがサイレント インストールによって展開したファイルの中で、アプリとして起動する実行ファイルを指定します。 最近は %ProgramFiles% 以下でなく %LocalAppData% 等にインストールするアプリケーションも増えていますが、それらの場合は失敗しました (私だけ? それとも Preview だから?)。

Evernote で数分、もっと軽いアプリであれば数十秒で完了するはずです。 変換すると、-Destination で指定したフォルダー内にファイルが出力されています。 -MakeAppx パラメーターを指定していれば、.appx も作成されています。

Output (Evernote -> AppX)

特に、Evernote フォルダーに注目してください。 インストーラーによって展開されたファイルが含まれていることが判るかと思います。

Evernote ファイル群

デプロイ

手元でデプロイして確認するには、AppxManifeset.xml を使用します (このコマンドレットの実行には管理者権限は必要ありません)。

すると、スタート メニューに Evernote アプリが追加されているはずです。

Evernote app on Start menu

起動すると、Evernote のウィンドウが立ち上がります。 当然ながら外観は普通にインストールした場合と変わりませんが、UWP パッケージ化された Evernote です。

Evetnote (UWP Packaged)

この方法でデプロイしたアプリは、先ほど確認した Evernote フォルダー内のファイル群から実行されています。 そのため、開発中のアプリ等では、一度デプロイした後は出力先に展開されているフォルダー内のバイナリを上書きすることで、毎度 Desktop App Converter による変換とデプロイする手間を省くことができます。

メリット

このツールによってデスクトップ アプリを UWP の AppX パッケージ化することによって、以下のようなメリットがあると考えられます。

ストア展開、サイドローディング、MDM

現時点ではまだ不可能ですが、Windows 10 Anniversary Update がリリースされる頃には、おそらく Desktop App Converter によって UWP パッケージ化したデスクトップ アプリがストアへ申請 & 掲載できるようになると思われます。 これにより、個人開発者が得られる恩恵は大きいはずです。

  • 配布を OS がサポートする Windows Store というプラットフォームに乗せられること
  • Windows Store によってマネタイズが容易になること

また、企業にとっては、パッケージ化によってサイドローディングや MDM が楽になる… といった恩恵がある、はず、です (そういうお仕事担当したことないのでよくわかりません)。

ファイルシステム・レジストリへの影響

UWP パッケージ化されたデスクトップ アプリは、ファイルシステム上の特定フォルダー (AppData など)、レジストリ、DLL への書き込みはリダイレクトされます。 展開後のフォルダーに Registry.dat ファイルや VFS フォルダーがありますが、おそらくここへ書き込まれていると思われます。

VFS

つまり、アプリのインストールや操作によって、OS のレジストリやファイルが書き換わることが基本的にありません。 レジストリの肥大化や DLL Hell といった現象を引き起こさないようにすることができ、クリーンなアンインストールを実現できます。 これは、開発者というよりは、ユーザーにとってのメリットとなるでしょう。

既存デスクトップ アプリの UWP 化ための 5 つのステップ

//build/ 2016、並びに Bringing your existing desktop apps to UWP という記事で言及されていますが、既存のデスクトップ アプリを UWP 化するための 5 つのステップが公開されています。

Step 1: Convert

step1

Desktop App Converter によって、AppX パッケージを作成するステップです。 これにより、以下が可能となります。

  • ストアへの申請
  • ストアからのシームレスなアップデート
  • クリーンなアンインストール

Step 2: Enhance

step2

デスクトップ アプリから UWP の API を呼び出すステップです。 従来から WinRT の一部の API はデスクトップ アプリから呼び出すことが可能でした (例えば、トースト通知とか)。

Desktop App Converter により UWP パッケージ化されたデスクトップ アプリは、以下のような、従来より多くの UWP API を呼び出すことができるようになります (すべて呼べるかどうかは未確認)。

  • ライブ タイルのサポート
  • Actionable Notifications (トースト通知操作)
  • Cortana 連携
  • その他いろいろ

例えば、私が開発している KanColleViewer というアプリ (「艦これ」のプレイング ツール) で、従来トースト通知していた内容をライブ タイルに表示する機能を実装したりできました。 KanColleViewer はデスクトップ アプリなので、従来はできなかったことです。

デスクトップ アプリのライブ タイル

Step 3: Extend

step3

UWP アプリとデスクトップ アプリをコラボレーションさせるステップです。 エントリー ポイントは UWP となり、フロント エンドを XAML で、コア ロジックを Win32 で、といった役割で別々に作成することができます。 両者は App Service で通信します。

  • UWP アプリとデスクトップ アプリの共存
  • バックグラウンド タスクの使用
  • フロント エンドを UWP にすることにより、File Picker UI などを使用

また、この動作を確認できるサンプルを Microsoft が GitHub で公開しています。 例えば AppServiceBridgeSample では、UWP アプリからデスクトップ アプリ (.exe) を起動して互いに通信する機能を持っており、興味深いサンプルとなっていますね。

Step 4: Migrate

step4

UWP 成分を増やすステップ?

Step 5: Expand

step5

すべてのコードを UWP でリプレースするステップです。 完全に UWP になることで、様々な Windows デバイスで動作させることが可能となります。

所感

ターゲットをデスクトップに絞ったアプリであれば、開発者にとっての選択肢が純粋に増えたという認識です。

  • Desktop App Converter により、従来の方法に加えて Windows Store での配布とマネタイズが可能となった
  • デスクトップ アプリから UWP API を呼んだり、UWP からデスクトップ アプリを起動してコラボレーションできるようになった

デスクトップ アプリにしかできないこと、UWP アプリにしかできないこと、それぞれ存在します。 従来は、デスクトップと UWP どちらで実現可能か、また他プラットフォームへの拡張可能性等を考慮してどちらで実装するかを選択する必要がありました。

しかし、Desktop App Converter の登場、またその上での移行ステップ 2 ~ 3 によって、デスクトップに限った場合はその両取りしたアプリを開発できるようになった、と考えています。 本記事の冒頭で「Project Centennial の存続を (勝手に) 危ぶんていた」と述べましたが、こうして見てみると既存の数多くのデスクトップ アプリをストアに乗せることができる、デスクトップ アプリ開発者にとっての救済手段、そして Microsoft にとってストア拡充ソース、と所謂 Win-Win と言えそうなこのツール、開発が止まるわけがありませんね (単純に、開発に時間がかかっていただけだそうで)。

既存アプリの UWP パッケージ化もそうですが、今後新規開発するアプリについても、広がった選択肢を存分に活用していきましょう。


※本記事は、Channel9 で公開されている //build/ 2016 の動画や MSDN ブログの情報、および Windows 10 Insider Preview 14342 時点での動作をもとに作成しています。 今後のアップデートで、本記事で記載した内容と異なる展開となる可能性があることにご注意ください。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です