この記事のまとめ
- 我が家のVivoTabRT - ASUS TF600T ではAnyCpuでビルドしたDesktop Appが動く事が判明した
- 理由は判らないが、思い当たる節が無くも無い
- 動作例は今のところ私の持ってる1台だけですが、同じ環境の人は試してみると動くかもですよ
事の起こり
ご存じの通り、Windows RT で動作する ユーザー アプリケーションはWindows ストア からインストールするストアアプリだけで、デスクトップ アプリケーション…Win32ベースのアプリケーションは動作しません(*1)。
ですが、.NET 以降のWindows にはOSの中に.NET Frameworkのビルド環境が一通り入っていることが知られています。Windows RT も例外ではなく、.NET v1, 2, 4の参照DLLと、.NET 4用のcsc.exe, csharpのコンパイラが入っています。
何に使っているのかは僕は知らないのですが…使うんだから入ってるのでは?NGEN用? そして、動くのなら案外ユーザーアプリもビルドしたら動いちゃったりして?
と、なんとなく考えました(
この先を読むと判りますが、この仮定はほぼ間違いでした が、話の進行上「そうかも?」という体で読んで頂けると幸いです)。
(*1) Microsoft 製の「Windows RT向けDesktop アプリ」は動作します。OS付属のメモ帳やエクスプローラー、加えて、VisualStudio 用のRemote Debug Tools(MSのサイトからDL可能)等がそれです。MS製だけ許すための署名+ハッシュ付きバイナリなのかなーと想像しますが確認はしていません。
やってみる
確認は簡単で、超単純なC# のプログラムを OS組み込みの.NET Frameworkでビルドしてみます。
Windows RT 機上でCommand Prompt を開き、
- OS組み込みの.NET Framework にパスを通す set path=%path%;C:\Windows\Microsoft.NET\Framework\v4.0.30319
- cscを叩いてビルド(*2) csc.exe test.cs /noconfig
(*2) Windows RT 組み込みの.NET Framework は Windows 8 のそれとはイコールでは無いようで、System.Data.Linq.dll, System.Data.Extensions.Design.dll 等が入っていません。この為、/noconfig を付ける必要があります。又、msbuild.exe 等も入っていないようです。
これを手持ちのASUS VivoTabRT で試すと、
|
「私の」VivoTabRT でのテスト |
おお。あっさり動きました。これは楽しい。ARM版VisualStudio なんてものは存在しないので本格的な開発は無理ですが、出先でC#の簡単なプログラム組んで遊ぶくらいは出来そうです。
ただ、上にも書いたようにWindows は署名を使ってプログラム実行許可・不許可を判断している(はず)ですが… 今ビルドしたこのプログラムはどういう扱いになるのだろう?謎です。
なので、今ビルドしたプログラムを、手持ちのSurface RT (色々あってRT二台持ちなのです)にCopyして実行してみると、ダメでした。…実行PC上でコンパイルしないとダメなのかな?とSurfaceRT 上でも全く同じ事をしてみても、
|
SurfaceRT でのテスト |
「このバージョンのfoobar.exe は、実行中のWindows のバージョンと互換性がありません。コンピュータのシステム情報を確認してから、ソフトウェアの発行元に問い合わせてください」
ビルドは通るのですが、実行しようとすると同じエラーが表示されます。????? ちなみにこれ、x86用のDesktopApp をWindows RT で実行しようとした時に表示されるエラーメッセージと同じです。
????何で? 一応二台のセキュリティ ポリシーを比較してみたのですが設定は同じでした。というか、そもそもセキュリティポリシーの変更だけでDesktop Appが動くのならWindows RT 発売と同時に誰かが即発見してお祭りになるでしょう。
段々意味が分からなくなってきました。
ビルドしたバイナリと実行の可否を確認すると、
- VivoTabRT でビルドしたバイナリ は VivoTabRT 上で動作する。
- VivoTabRT でビルドしたバイナリ は SurfaceRT 上で動作しない。
- SurfaceRT でビルドしたバイナリ は SurfaceRT 上で動作しない。
- SurfaceRT でビルドしたバイナリ は VivoTabRT 上で動作する。
…これ、ビルド環境で違いが出てるのでは無くて、単にVivoTabRTがザル、ノーチェックで動いてるだけなのでは?という気がしてきました。
確認してみます。
Windows 8.1 機 (x64 の普通のWin8.1PCです)上のVisualStudio で.NET Application をターゲット「Any CPU」でビルドし、件のVivoTabRT で動かしてみます。
|
正直、目を疑う光景ではあります |
Oh... ビルド環境云々では無く、「この」VivoTabRT は
何故かDesktop App がノーチェックで動いてしまう、かなり妙な状態になっていることが確認できました。
また、上で
SurfaceRT 上でビルドしたテストプログラムが動かないのも、それが(MSが)意図する正しい動作であろうことも判ります。
考察
「この」VivoTabRTが何故こんな状態になっているのか?方法が判れば楽しいのですが、残念ながら今のところ判りません。グループポリシー上はSurfaceRTと同じ設定ですから、SurfaceRT や別のRT機でこの状態に入れる方法も判りません。
ただ、思い当たるというか、ひょっとして?という点が一つあります。
去年 Windows8.1 / 8.1RT がリリースされ、VivoTabRT をアップデートしたのですが…その際、以下のような不具合がありました。
|
VivoTabRT を 8.1RT に更新した当時のスタート画面 |
「SecureBootが正しく構成されていません」というWarningが、スタート画面・デスクトップの右下に表示される、という不具合でした。
なお、手持ちのSurfaceRTではこの不具合は発生していません。
この不具合、結構多くのVivoTabRT (TF600T)で発生していたようで、当時MSのSupport Forumで報告が多く寄せられていました(私も文句書きましたし、ASUS サポートに連絡もしました。その後返事無いですが…)。
その後、「Warning Messageを表示しなくする」というPatch がWindows Updateで配布され、上のWarning Messageは表示されなくなりました。
問題の根本、「SecureBootが使えてない状態」そのものは直らず、放置されたことになります。
このSecureBoot、EFI System+Win8では必須で、これがOnになっているとWin8以外のOSは動作しない、というもので・・・あーつまりLinuxも入れたら動くのかな俺のVivoTabRT、くらいにしか考えていなかったのですが。
ですが、今回のVivoTabRTのザル動作と、SecureBootが結局直っていない事を合わせて考えると…
「SecureBoot がDisable になっていると Windows RT は UserAppの実行時チェックを行わなくなる」
という動作をしているのでは?という推測が出来るのではと考えています(*3)。
しかし、何分にも
実例が私のVivoTabRT 1台だけで、自信を持って言える話では全く無いのも確かです。
もしあなたがASUS VivoTabRT TF600T や SurfaceRT / Surface2 のようなWindows RT機をお持ちで、また、上に書いたようなSecureBootエラーを経験されていたら…本記事で書いた手順でUser Appが実行できるか試してみると面白い結果が出るかもしれませんよ。
(*3) なお、一般的なx86/64 PC では PC起動時の EFI 設定で SecureBoot の設定を変更できるオプションが用意されているのですが、 ARM機の Windows RT ではそもそもSecureBootの設定項目自体がありません。