上記の記事でCCIの存在を知りました。.NETバイナリ(CILを含んだEXEやDLL)を読み書きするライブラリです。
id:atsushienoさんにCecilを教えてもらいました。Monoプロジェクトが提供する.NETバイナリを読み書きするライブラリです。
- Cecil - Mono
- id:akiramei:20080923:1222158287 (使用例)
Cecilの誕生には、以下のような経緯があったそうです。
http://twitter.com/atsushieno/status/1565378495
Cecilは5年前にCecilハカーがCCIのOSS化を提案して断られたからあるのだよねえ。採用実績を見ればどっちが正解だったかは一目瞭然だ。
実は以前から名前だけは耳にしたことがあったのですが、CeCILLと勘違いしてスルーしていたようです。(さすがにcecileだとは思っていなかったので念のため)
CCIで逆コンパイル
CCIにはcciast(Code and AST)というコンポーネントがあります。
VC# 2008 Expressでビルドしてみました。cciastからはCCI本体(Metadata)を参照しているため、cciastフォルダの中にMetadataフォルダを入れておく必要があります(ソリューションファイルをテキストエディタで開くとMetadataのプロジェクトの配置が相対パスで書いてあるので、うまくいかないときは参照してみてください)。ソリューションを開くときに「ソリューションフォルダはこのバージョンのアプリケーションではサポートされていません。(以下略)」というエラーが出ますが、無視しても差し支えないようです。
サンプルのPeToTextを使用すると、.NETのバイナリ(EXE/DLL)をC#に逆コンパイルすることができます。PDBファイルがあればCILがC#との対訳形式で出力されます。文字を表示するだけのプログラムを逆コンパイルした結果は以下の通りです。
abstract sealed static class Program { private static void Main() { { System.Console.WriteLine("Hello, CCI!"); return; } IL_0000 ... IL_000d { } test.cs(2:40)-(2:41): { IL_0000: Nop test.cs(2:41)-(2:74): Console.WriteLine("Hello, CCI!"); IL_0001: Ldstr "Hello, CCI!" IL_0006: Call System.Void System.Console.WriteLine(System.String) IL_000b: Nop test.cs(2:74)-(2:75): } IL_000c: Ret } }
幻のC# Lite
CCIのサンプルとしてSmallBasicが提供されています。
更新履歴を見ると、以前はC#のサブセットが提供されていたことが分かります。
http://ccisamples.codeplex.com/SourceControl/ListDownloadableCommits.aspx
Delete CSharpLite at the request of the C# team.