Metro Style AppsでMSIL
ver. 2012/06/09
terurou
自己紹介
自己紹介
どうもこんにちわ、
terurou です。
DSTokaiの管理人やってます。
• 東海地方のメタコミュニティ
 – 複数コミュニティへの共通連絡窓口
 – IT系イベント情報の共有
 – DSTokaiカレンダー
 – http://go.dstokai.info/
• クロスコミュニティイベントの企画
 – NGK:名古屋 合同 懇親会
Web技術を広く浅くやってます。
• フロントエンド
 – Silverlight, JavaScript, Android
 – Tech Fielders Member(ページ消滅)
 – 最近 Metro Style Apps始めました。
• バックエンド
 – Cassandra, 自作KVS, AWS
• フロント寄りのアーキテクチャ設計を
  割と得意としてます。
今から話すネタについて
ML名古屋の発表スライドの流用です。
• ML名古屋?
 – 5/26に開催されたイベント
 – なごやこわい
• 6/1のWindows8 RPのリリースに
  合わせ、最新情報に更新しました。
このLTのゴール地点
Metro Style AppでEXE生成するよ、
デスクトップアプリ用のやつ。
過去の類似犯行
• Silverlight上でScalaプログラムを実行
 – Scala→MSIL + アセンブリバイナリ改変
• Silverlightアプリ(XAP)を動的に
  生成するWebサーバの作成
 – DSL→MSIL→XAP化
Metro Style Appsとは?
Metro Style Apps
• Windows 8から導入される
  新しいアプリケーションの種別
 – 旧来型アプリ=Desktop Apps
WinRT
• Metro Style Apps専用API
 – Win32 API と .NET Framework 共に
   Metro用のサブセットAPIとなっている。
• いろんなものが非同期API
 – File I/O APIとかDialogとか
• サンドボックスモデル
 – ユーザの同意なしには全てのファイルや
   デバイスを自由に操作できません。
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が存在しない…?
Reflection… Emit…?
がっつりAPIが削られてしまっていて、
ぺんぺん草すら生えていない…!
Reflection.Emit 完全終了のお知らせ
• Reflection.Emit(低レベルAPI)が
  隠ぺいされ、高レベルAPIのみ利用可
 – System.Linq.ExpressionTree
 – System.Dynamic
• でも、Reflection.EmitがないとEXEの
  出力/保存ができないのだけど…。
詰んだ?
そんなところに颯爽と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ツール
Mono.CecilをMetroに移植しよう
• Mono.CecilはMetroに対応してない。
 – Metro用の.NETはサブセット版だしね。
• Metro用クラスライブラリとして移植
 – 既存の.NETプロジェクトではMetroを
   ビルドターゲットに指定できないので、
   Metro用にプロジェクトを作り直す。
 – Portable Class Libraryでは多分無理。
    • Reflection APIが違いすぎる
Mono.Cecil 移植のポイント
• Reflection APIの差異を埋める
 – GetTypeInfo()への置き換えなど
• System.Security.Cryptography
  → Windows.Security.Cryptography
• File I/Oはサポートしない
 – StreamでのI/Oに限定
Mono.Cecil for Metro
• ソースをGitHubに置いておいた
 – https://github.com/terurou/cecil
 – とりあえずコンパイルを通したレベル
 – まだテストコードを移植してない
• Windows8 製品版で動作しなくなる
  可能性があるので注意。
デモ
• Metro Style AppsからDesktop用の
  コンソールアプリを動的生成します。
 – Hello World的なことするだけです。
まとめ
Metro Style Appsで
EXE出力して何が嬉しいのかは
私にもよくわからないですね。
少し真面目に利用用途を考える
• 動的生成したアセンブリをキャッシュ
 – 都度生成では性能問題が出るケースに
• Metro用DSL/コンパイラを実装
 – Metroアプリ内DSL
 – Desktopアプリの生成
 – Silverlightアプリ(XAP)の生成
    • SilverlightでXAP生成はできたので、
      9割方実現できるはず
ご清聴ありがとうございました

Metro Style AppsでMSIL ver.2012/06/09