2015年2月22日日曜日

ストアアプリ が C#/C++/HTML どれで書いてあるかを確認する方法

ストアアプリがC#/C++/HTML, どの言語で書いてあるか気になりませんか?特に…これXAMLでどうやってんの?HTMLかも?という場合。以下がその方法です。

(2016/01/29 追記:Win10 以降の UWP…Universal Windows Platform Appでは、.NET を使うAppは全て.NET Native で配布されます。このため、この記事後半のC#/C++ の見分け方は通用しなくなっています。この記事の例・PICT8の用に、全てNativeBinaryの形です。)

※ この記事ではC#とVBの.NET 組を合わせてC#と表記しています。VB派の人ごめん。

タスクマネージャの詳細タブを開き、ヘッダで右クリック→列の選択と進み、「パッケージ名」をチェックします。

タスクマネージャ→詳細→ヘッダを右クリックして「列の選択」

すると、このように「アプリのパッケージ名」に対応する「プロセスの実行ファイル名」が分かります。

アプリ名とプロセス実行ファイル名

ここで実行ファイル名が「WWAHost.exe」になっているものはHTML/JS アプリです。

なっていないものはC# 又は C++ アプリです。

C#とC++を見分けるには…色々方法有りそうですが、僕が使っているのは Visual Studio と一緒に入るWindows SDK の CorFlags.exe を使う方法です。

実行ファイルが.NET モノの場合ヘッダには必ずCLR ヘッダが付き、C++ストアアプリ==ネイティブ実行ファイルには付きません(OSのローダはここを見てCLRをロードするか決めるので)。CorFlags に実行ファイル名をパラメータとして渡すことで、このCLR ヘッダ情報を確認する事が出来ます。

Visual Studio の開発者コマンドプロンプトを管理者権限付きで開き(というかSDKの.NET toolsにPathが通ってればなんでもいいですが)、c:\Program Files\WindowsApps 以下のアプリのディレクトリに移動し、アプリの実行ファイルをパラメータとして「CorFlags.exe」を実行します。

CLR ヘッダ情報が表示される場合、それは.NET アプリケーションです。
表示されない場合、それは ネイティブ アプリケーションです。


C#ストアアプリ Wheel World Clock に対してCorFlags.exe を実行した様子
CLR ヘッダが存在しているのが分かります

C++ ストアアプリ に対してCorFlags.exe を実行した様子
CLR ヘッダが含まれないためエラーとなります。


ちなみに、Program Files\WindowsApps を覗くと、HTML AppはHTMLやJavascript ファイルの中身を覗くことができます。ただ微妙にリバースエンジニアリングに片足突っ込んでいる気配もするので…この辺りにしておきます。

※ 管理者権限のコマンドプロンプトからはWindowsApps にアクセスできますが、エクスプローラーでアクセスするには結構色々権限を弄る必要がある+戻すのも大変なのであまりお勧めしません。

※ Win8 ターゲットのC#/C++ XAML アプリは、この方法でXAMLも覗くことができました。ビルドターゲットをWin8.1 にしている場合、XAMLはXBFにコンパイルされた形でインストールされるのでダメですが。


余談

これで色々動かしてるとすぐ判るのですが、プリインストールされているMicrosoft のストアアプリは殆どがHTML/JS アプリです。逆に、ストアに上がっているものはC#が圧倒的に多い感じがします。たまにHTML、まれにC++的な。ゲームだとC++が多いのかもしれないですが、僕はあまりゲームやらないので良く判りません。

余談2

現在はVS2015 で試すことができる面白技術、.NET Native をご存知でしょうか。.NET で書いたアプリをストアからDLする際、実行環境のアーキテクチャに応じてNativeにコンパイルし直した状態でインストールされるという、何周も回ってよくわからないけど凄い感じの技術です。これを使えば.NET Frameworkが全く入って無くてもC# ストアアプリが実行できるんだぜ!とMSさんは豪語しています(そんな環境があるのかどうかはともかく)。

確認してみましょう。C# で書いたストアアプリ PICT8 をこの.NET Native 有効にしてビルドし、実行ファイルを確認すると…

.NET Native アプリでCorFlags.exe を実行した様子

おおおお、確かにネイティブバイナリです。凄い。

0 件のコメント:

コメントを投稿