Metro Style Appsで
MSIL
terurou
自己紹介
自己紹介
どうもこんにちわ、
terurou です。
DSTokaiの管理人やってます。
• 東海地方のメタコミュニティ
 – IT系イベント情報の共有
 – 複数コミュニティへの共通連絡窓口
 – DSは「でら すたでぃー」らしいです
 – http://go.dstokai.info/
• クロスコミュニティイベントの企画
 – NGK:名古屋 合同 懇親会
Web技術を広く浅くやってます。
• フロントエンド
 – JavaScript, Android, Silverlight
 – 最近 Metro Style Apps始めました。
• バックエンド
 – Cassandra, 自作KVS, AWS
• フロント寄りのアーキテクチャ設計を
  割と得意としてます。
今日のネタについて
MSILネタを話すと宣言したものの…
MSILネタって、半年程前のイベントで
桜花っていう幼女っぽい人が話をしてた
じゃないですか、やだー
マジで何を話すんや…
とりあえずプログラムを確認するために
ML名古屋の告知ページを開いてみたら、

あなたの知らない世界セッション

っていうのに分類されていた。
あなたの知らない世界
誰も思いついてもやろうとは思わない
やったことのないネタを話せばOKと、
解釈致しました。

行間を読む力、
この業界では重要ですね。
ということで
Metro Style AppsでMSILをごにょって
EXE(.NETアプリ)を生成します。
Metro Style Appsとは?
Metro Style Apps
• Windows 8から導入される
  新しいアプリケーションの種別
 – 旧来型アプリ=Desktop Apps
Metro Style Apps
• WinRTという新たな基盤上で動作
• タッチ操作や視認性を強く意識
 – カクカクして大きなボタン(タイル)
 – 単一色塗りつぶし
 – 大きな余白 など
• Windows Storeからインストール
 – Store以外からのインストールはできない
• 拡張子は .appx
WinRT
• Metro Style Apps専用API
 – MetroでWin32 APIは叩けません。
 – Win32 APIはMetro用のサブセットです。
 – .NET APIもMetro用の別物を使います。
• いろんなものが非同期API
 – File I/O APIとかDialogとか
• サンドボックスモデル
 – ユーザの同意なしでは全てのファイルや
   デバイスを自由に触らせてくれません。
WinRT
いろんな言語で開発できます。
• C++
 – ゲーム開発ではこれ一択?
• .NET(C#, VB.NET)
 – F#は今のところ無理だかんな。
• HTML/JavaScript
 – 少し検証したけど、個人的にはないわー
MSILとは?
MSIL
• CLI(.NETのVM)用の機械語
 – コンパイルするとCIL用のバイトコードに
• MicroSoft Intermediate Language
 – Intermediate Language = 中間言語
• ECMA CIL(Common IL)としても
  標準化されている
 – MSILはCIL準拠/拡張という位置づけ
Metro Style AppsでMSIL生成
Reflection.Emit!
• .NETでMSILといえばReflection.Emit
 – Reflection.Emitを使うとプログラム内で
   動的にMSIL/バイトコードを生成できる。
• さっそくコードを書こう
Reflection… Emit…?
• AssemblyBuilder#Save()が
  存在しない…だと…?
Reflection.Emit 終了のお知らせ
• AssemblyBuilder#Save()がないと
  EXEを動的生成できない。
• ドキュメントやAPIを漁ってみたけど、
  それっぽい代替APIも存在しない。

• 本当にありがとうございました。
  Reflection.Emit先生の次回作にg
そんなところに颯爽とMono.Cecilが!
Mono.Cecil
• Cecil is a library written by Jb
  Evain to generate and inspect
  programs and libraries in the
  ECMA CIL format.
• 要はCIL(MSIL)をごにょごにょする
  素敵ライブラリ。
Mono.Cecilの採用事例
• Mono Debugger
  – Cecil自体がMonoプロジェクトだしね。
• ILSpy
  – .NET逆アセンブリツール
  – SharpDevelopのグループが作ってます。
• 各種weaving/AOPツール
てか、そもそも
• 1か月ぐらい前まで、今日のネタは
  Mono.Cecilの紹介をする予定でした。
• そう、WDDに行くまではね。
 – WDD:Windows Developers Days
MetroでMono.Cecilを使う
「NuGet(*)したら一発だよねー」
「…?」
「CecilのDLLがMetroプロジェクトで
 参照できない…。」
「そういえば思い当たる節が…。」

(*)NuGet:.NETのパッケージマネージャ
WinRT
• Metro Style Apps専用API
 – MetroでWin32 APIは叩けません。
 – Win32 APIはMetro用のサブセットです。
 – .NET APIもMetro用の別物を使います。
• いろんなものが非同期API
 – File I/O APIとかDialogとか
• サンドボックスモデル
 – ユーザの同意なしでは全てのファイルや
   デバイスを自由に触らせてくれません。
MetroでMono.Cecil使えないけど
• OSSだし改造したらいいんじゃね?
  .NETだし簡単に移植できるんじゃ。
• あまり簡単じゃないけど移植できた!
Mono.Cecil for Metro 改造点
• Metro Style Apps用の.csproj作成
 – .NET用プロジェクトと共通化できない
• Type型のAPI差異を埋める
 – GetTypeCode(), GetTypeInfo()
• System.Security.Cryptography
  → Windows.Security.Cryptography
• File I/Oは今回は未実装に…。
 – 非同期APIへの置き換えは影響が大きい
Mono.Cecil for Metro の注意点
• あくまでBeta版SDKでの話です。
• 過去の経験上、MSのBeta版SDKは
  製品版と差異が結構出ます。
• 今回の改造はソース公開しません。
 – 製品版SDKリリースされても本家が
   対応しなかったらPull Requestぐらいは
   送りたい気はする。
 – Beta版SDK使ってるのでお察しください。
デモ
• コンパイルが通ったしデモができる!
• Metro Style AppsからDesktop用の
  コンソールアプリを動的生成します。
 – まぁHello World的なことするだけです。
まとめ
• Mono.Cecilは強力なライブラリ
• 既存.NETライブラリのMetro移植は
  結構めんどくさい。
 – 特にファイル回りは鬼門。
 – Metroには存在しないAPIもあるし。
 – C++でも同じことになるはず…。
• Metro Style Apps楽しい!
まとめ




 Metro Style Appsで
 EXE出力して何が嬉しいのかは
 私にもよくわからないですね。
ご清聴ありがとうございました

Metro Style AppsでMSIL