metro style appsでmsilver.2012/06/09
TRANSCRIPT
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割方実現できるはず
ご清聴ありがとうございました