特別企画

UWP時代への橋渡しをするDesktop App Converter

 米Microsoftでは、Windows 10をクライアントデバイスの統一的な基盤OSとして位置付ける一方で、アプリをUWP(Universal Windows Platform)ベースに徐々に移行しようと考えている。

 UWPアプリはWindowsストアから配布を行うことになり(コンシューマの場合)、より多くのユーザーに届けやすくなるし、課金もしやすくなる。これにより、AppleやGoogleがスマートデバイスで行っているような、アプリのエコサイクルを作り上げようとしているわけだ。

 しかし、こればかりはMicrosoftの思惑だけでは進まない。多くの開発者や企業では、UWPベースのアプリ開発がほとんど進んでいない。開発者は、UWPが本当にWindowsアプリ開発の中心になるのか疑問の目で見ている。また、UWPベースのアプリを開発するのは、開発のエコサイクルが完全にできていない現状では、ハードルが高すぎる。

 そこで、考えられたのが、既存のアプリケーションをUWPベースで動作するようにするDesktop App Converter(Project Centennial)というわけだ。現在はβ版だが、多くのユーザーがテストできるようになっている。

 今回は、このDesktop App Converterを実際に利用してみよう。

Desktop App Converterとは?

 Desktop App Converterとは、大ざっぱに言ってしまえば、exeやmsi形式で配布されているWin32、.NETのアプリケーションをUWP(Universal Windows Platform)ベースで動作するようにするコンバートツールだ。このツールを利用すれば、旧来のアプリケーションをUWPアプリとして動かせるようになる。

 具体的には、Windows Server 2016で採用されるコンテナ技術を利用することで、アプリケーションが動作する環境をコンテナ化してラッピングし、UWPベースで動作するようにしている(つまり、既存アプリケーションのソースコードを自動的にUWPベースのアプリにコンバートし、さまざまなUWPの機能を利用できるようにするわけではない)。

 また、Desktop App Converterでは、コンテナ化された仮想OS環境にアプリケーションをインストールする際、アプリケーション仮想化技術Microsoft Application Virtualization(App-V)で使われているテクノロジーも利用している。これにより、インストール時にシステムフォルダへDLLをインストールしたり、レジストリにデータを書き込んだりして、仮想OS上で同じ環境を実現している。

 Desktop App Converterによりアプリケーションの動作環境が仮想化されるため、ホスト側のWindows 10のレジストリが肥大化することもないし、DLLの互換性問題を引き起こすこともないわけだ。

Desktop App Converterでは、アプリケーションを仮想環境にインストールし、UWPでラップして動かす。コンテナ技術が利用されている(Build 2016あるいはde:code 2016の資料より、以下同じ)

Desktop App Converterの動作環境

 Desktop App Converterを使いUWPアプリ化する場合は、実行形式(exeやmsi形式)のアプリケーションであればコンバートを行える。ただし、コンテナ化された仮想OS環境にアプリケーションをインストールするために、サイレントインストール機能がアプリケーション側に必要となる。

 注意が必要なのは、Desktop App ConverterによりUWP化したといっても、Windows 10 Mobile、Winodws 10 IoT、Xbox One、Surface Hubなどで動作するわけではない点だ。コンバートされたUWPアプリは、PC版のWindows 10でしか動作しない。

Win32アプリケーションのコードをUWPのコードに変換するのではなく、Win32アプリケーションの動作環境をUWPでラップするだけ。このため、PC向けのWindows 10でしか動作しない

 コンテナ機能が必須のため、コンテナ機能が追加された次期大型アップデート「Windows 10 Anniversary Update」以降のWindows 10でのみ利用可能となり、Windows 10 November Updateやリリース当初のWindows 10では動作しない。また、Windows 10 Anniversaryに対応したWindows 10 SDKも必要になる。

 コンテナ機能やApp-Vの機能を利用するので64ビット環境が必須。さらにハードウェア環境としては、CPUに仮想化支援機能(VT-x、SLAT)が必要になる。クライアントによっては、BIOSで仮想化支援機能がオフになっている場合があるので確認しておこう。

 なお、Windows 10 Anniversary Updateがリリースされていない現状では、Insider PreviewのWindows 10 x64版が必要になる(Build 14342以降は、Enterpriseだけでなく、Proでも動作する)。

 一番問題になりそうなのは、コンテナ機能を利用しているため、Desktop App Converterで使用するOSイメージと、ホストOSのビルド番号がそろっている必要がある点だ。

 6月20日現在、Windows 10 Anniversaryの最新ビルドは14367だが、Desktop App ConverterのOSイメージではBuild14361が最新版のため、コンバート時に問題が起きる。このためDesktop App Converterを使う時には、ホストOSとDesktop App Converterで利用するOSイメージのビルド番号を合わせておく必要がある(Windows 10 Anniversaryが正式にリリースされれば、このような問題もなくなるはずだが)。

 この、ホストOSとDesktop App Converterが利用するOSイメージを合わせるという必要性は、企業内でコンバートしたUWPアプリを使用する際に問題になる可能性がある。Windows 10 Anniversary Updateの次の大型アップグレードがリリースされる時には、ホストOSとOSイメージのビルドが異なり動作しない、といったことも起こるだろう。

Desktop App Converterを使う前に、Windowsデベロッパーセンターのページをよく読んでおこう

Desktop App Converterの使い方

 さて、では実際にDesktop App Converterを使ってみよう。

 まず、Windows 10自体を「開発者モード」にする。

設定→更新とセキュリティ→開発者向けで「開発者モード」に設定しておく。

 続いてWindows 10 SDKの最新版をインストール。Desktop App ConverterではSDKの「Windows App Certification Kit」(Appxへの変換)だけを利用するため、ほかのオプションはインストールしなくてもいい。

Insider Previewの開発者向けからWindows SDKをダウンロード
Desktop App Converterが使用するのは、Windows App Certification Kitのみ

 その後、Desktop App Converterをインストール(ダウンロード時にDesktop App ConverterとOSイメージもダウンロード)する。現状ではGUIなどは用意されていないため、PowerShellのコマンドラインでインストールする。

Desktop App Converterをダウンロード。DesktopAppConverter.zipとBaseImageをダウンロードしておく

 PowerShellでDesktop App Converterをインストールする際は、PowerShellを管理者権限で起動し、Desktop App ConverterのPowerShellファイルを実行できるように、スクリプトの実行制限を解除しておく。

PowerShellを管理者権限で起動する

 Desktop App Converterのインストールは、PowerShell上で

.\DesktopAppConverter.ps1 -Setup -BaseImage .\BaseImage-XXXX.wim

(BaseImageーXXXXは、OSのBuildに合わせたモノを使用する)を実行する。数度、再起動が行われた後、Desktop App Converterが使用できる環境が構築される。

Desktop App Converterのインストール画面

 続いて、UWPアプリに変更するアプリケーションを用意する。アプリケーションはexe形式でもmsi形式でもOK。ただし仮想環境にインストールするため、サイレントインストールが行えるオプションを持っているアプリケーション、もしくは、対話形式でのユーザーの入力を必要としないアプリケーションのみ対応している。

 .\DesktopAppConverter.ps1 -ExpandedBaseImage C:\ProgramData\Microsoft\Windows\Images\BaseImage-XXXX -Installer C:\Installer\MyApp.exe(変換するアプリケーション名) -InstallerArguments "/S"(アプリケーションのサイレントインストール オプション) -Destination C:\Output\MyApp -PackageName "MyApp"(UWPのアプリ名) -Publisher "CN="(アプリの作成者名) -Version 0.0.0.1(バージョン番号) -MakeAppx -Verbose

とPowershellで実行しよう。

 変換したアプリのインストールは、

Add-AppxPackage -Register AppxManifest.xml(変換されたアプリのマニフェストファイル)

 これで署名なしで、ローカルのPCにインストールすることができるが、もしWindowsストアなどにアップロードして配布する場合は署名する必要がある。

 実際に起動してみると、画面がほとんど変わらないため、ユーザーにとってはWin32なのか、UWPアプリなのかはまったくわからない。

de:code 2016の基調講演では、秀丸をUWP化するデモが行われた。Desktop App Converterのβ版では、アイコンのイメージを変換することはサポートされていない。UWPアプリとして表示されている
起動すると、いつもの秀丸と同じような表示が行われ、利用できる

 UWPアプリ化された場合は、タスクバーに表示されている実行中のアプリを右クリックすると、Win32アプリケーションの場合はプロパティなどが表示されるが、UWP化したアプリでは、ほかのUWPアプリと同じくプロパティは表示されない。

タスクバーのアイコンを右クリックしても、Win32アプリケーションのようにプロパティなどのコンテキストメニューは表示されない

Microsoftの思惑

 前述のように、MicrosoftではアプリをUWP(Universal Windows Platform)ベースに徐々に移行しようと考えている。

 その最初のステップとして、Desktop App ConverterによるWin32アプリケーションのUWPアプリ化が位置付けられるわけだ。

ファーストステップとして、Desktop App ConverterでWin32アプリケーションのUWP化
UWP化することで、ホストOSのレジストリが肥大化したり、DLLが競合したりといった問題も片づく

 次のステップとしては、Win32などのアプリケーションを少し修正して、UWP APIに対応していく。3つ目のステップでは、機能の一部のUWPアプリに置き換える。

2つ目のステップとしては、UWPの一部のAPIをコードに埋め込んでいく
3つ目のステップとして、機能の一部をUWPアプリで置き換える
Win32アプリケーションとUWPアプリの通信はAppServiceで行う

 4つ目のステップとしては、Win32などのアプリケーションのコードをできるだけUWPネイティブのコードに置き換えていく。この時、UWP化しにくいコードは、一部Win32などのコードとして残し、UWPコードと連携して動かすようにする。

 最後のステップとしては、Win32などのコードを排除して、すべてをUWPネイティブのコードとして書き換える。

できるだけWin32のコードを少なくして、UWPアプリのコードを増やしていく
最終的には、すべてUWPネイティブのコードに変更する。こうなれば、PCだけでなく、Mobile、Xbox One、HoloLensなどにも対応する

 このように、Win32などのアプリケーションを一気にUWP化するのではなく、段階を踏んで徐々にUWPネイティブアプリ化するための道筋を提供しようとしている。

 Desktop App ConverterでコンバートしたアプリケーションはPC版のWindows 10でしか利用できないが、最初のステップとして、Desktop App Converterで現在のプログラムをUWPベースで動作するようにしておきつつ、開発者がUWPベースでのアプリ開発に慣れてくるにしたがって、徐々にUWPに移行していけばいい、と考えているようだ。

 最初に述べたように、Windowsストア経由でアプリを提供できれば、より多くのユーザーに対してアプリを届けられるようになるし、インストールやアンインストール、アップデートなどが容易になる点もメリットだろう。

 さらにネイティブのUWPアプリであれば、同じアプリをPCのWindows 10でも、スマートフォンのWindows 10 Mobileでも利用できる。iPhoneやAndroidと比べ、プラットフォームとして立ち遅れているWindows 10 Mobile向けのアプリを充実させる意味でも、UWPのアプリを少しでも増やしたいのだろう。

 将来的には、Xamarinの開発プラットフォームを利用することで、ビジネスロジックはPC、iOS、AndroidなどすべてのOSで共通化し、UIや各OSの独自機能の部分だけ、それぞれのOS向けにコードを開発するようになれば、多くのコストと開発時間をかけずに、複数のOSにアプリを対応させることができるようになるだろう。