滅入るんるん

何か書きます

【C#】ILSpyを使ってCILを見る

前回の記事でReSharperを使ってCILを見てみましたが、ReSharperを利用すると該当ファイルのCILしか見れず、アセンブリ情報などのCILは見れませんでした。
前回記事:[C#]ReSharperを使ってCILを見る

そこで、ReSharper購入以前に使っていたILSpyを使って見ようと思ったらVisual Studio Extensionがあるのを今更発見したので紹介しておきます。

インストールは簡単でVisual Studioのツールバーのツール=>拡張機能と更新プログラム=>オンラインからILSpyを検索して出てきたものをインストールするだけです。

インストールできたらソリューションエクスプローラーのプロジェクトを右クリックするとILSpyで開く項目があるのでクリックしましょう。

クリックしたらILSpyのWindowが開くのでCILを眺めることができます。

と言ってもアセンブリで眺めたい情報ってあまりないかなという感じですね。

.assembly SharedProperty.NETStandard  
{  
/*略*/
.hash algorithm 0x00008004 // SHA1  
.ver 1:0:0:0  
}  
  
.module SharedProperty.NETStandard.dll  
// MVID: {908E02B5-14DD-4164-8C84-C47735CD9DCA}  
.corflags 0x00000001 // ILOnly

たとえば、SharedProperty.NETStandardはこんな感じのアセンブリ情報ですけど、見た目そのままの意味です。
.NET IL Assemblerという本には.assembly extern { auto }みたいな感じでバージョン自動解決なアセンブリインポート?というのができるみたいな感じに書いてありましたけどそういった記述は見つけることができず…
ILSpyでアセンブリのReferencesで参照アセンブリがコメントで書かれてるのでILSpyが自動判別してる…?(未確定情報)

また、ILSpyなら名前空間の情報も見れます。(たいした情報ないですけど)

.namespace SharedProperty.NETStandard.Storage  
{
    .class public auto ansi beforefieldinit SharedProperty.NETStandard.Storage.FileStorage
    {
        /*略*/
    }

    .class public auto ansi beforefieldinit SharedProperty.NETStandard.Storage.IsolatedFileStorage
    {
        /*略*/
    }
}

SharedProperty.NETStandard.Storageならこんな感じになりますが、肝心の.class情報はReSharperでも見れますし、ILSpyでも個別表示できます。

.classの中のautoはフィールドなどの配置を自動にしていることを表して、ansiというのはアンマネージコードと相互運用するときの文字列変換モードの1つでC言語スタイルということを表しているようですが、詳しいことはCILをそれなりに理解してから書いていきたいと思います。