MSIL アセンブラ (Ilasm.exe)
MSIL アセンブラは、ポータブル実行可能 (PE) ファイルを MSIL (Microsoft Intermediate Language) から生成します。MSIL の詳細については、「MSIL へのコンパイル」を参照してください。MSIL と必要なメタデータを含む実行可能ファイルを実行すると、MSIL が予測どおりに動作するかどうかを確認できます。
ilasm [options] filename [[options]filename...]
パラメータ
| 引数 | 説明 |
|---|---|
| filename | .il ソース ファイルの名前。このファイルは、メタデータ宣言ディレクティブとシンボリック MSIL 命令で構成されます。複数のソース ファイル引数を指定すると、Ilasm.exe で 1 つの PE ファイルを作成できます。 |
| オプション | 説明 | ||
|---|---|---|---|
| /alignment= integer | NT オプション ヘッダーの FileAlignment を integer で指定された値に設定します。このオプションは、ファイル指定されている .alignment IL ディレクティブをオーバーライドします。 | ||
| /base= integer | NT オプション ヘッダーの ImageBase を integer で指定された値に設定します。このオプションは、ファイルに指定されている .imagebase IL ディレクティブをオーバーライドします。 | ||
| /clock | 指定した .il ソース ファイルのコンパイル時間を計測して報告します。 Total Run: 後に続く特定の操作の実行に要した合計時間。 Startup: ファイルの読み込みとオープン。 Emitting MD: メタデータの生成。 Ref to Def Resolution: ファイルの定義への参照の解決。 CEE File Generation: メモリ内のファイル イメージの生成。 PE File Writing: PE へのイメージの書き込み。 | ||
| /debug[=IMPL|OPT] | デバッグ情報 (ローカル変数と引数名、および行番号) を組み込みます。PDB ファイルを作成します。 /debug に値を追加しなければ、JIT の最適化が無効になり、PDB ファイルのシーケンス ポイントが使用されます。 IMPL を指定すると、JIT 最適化が無効になり、暗黙のシーケンス ポイントが使用されます。 OPT を指定すると、JIT 最適化が有効になり、暗黙のシーケンス ポイントが使用されます。 IMPL 属性と OPT 属性は .NET Framework Version 2.0 で新たに追加されました。 | ||
| /dll | 出力として .dll ファイルを生成します。 | ||
| /enc=file | 指定されたソース ファイルからエディット コンティニュ デルタを作成します。 .NET Framework Version 2.0 で新たに追加されました。 | ||
| /exe | 出力として実行可能ファイルを生成します。これは、既定の設定です。 | ||
| /flags= integer | 共通言語ランタイム ヘッダーの ImageFlags を integer で指定された値に設定します。このオプションは、ファイルに指定されている .corflags IL ディレクティブをオーバーライドします。有効な integer の値の一覧については、CorHdr.h で COMIMAGE_FLAGS を参照してください。 | ||
| /fold | 複数の同じメソッド本体を 1 つに折りたたみます。 .NET Framework Version 2.0 で新たに追加されました。 | ||
| /include=includePath | #include によってインクルードされるファイルの検索パスを設定します。 .NET Framework Version 2.0 で新たに追加されました。 | ||
| /itanium | ターゲット プロセッサとして Intel Itanium を指定します。 イメージのビット数を指定しない場合、既定は /pe64 です。 .NET Framework Version 2.0 で新たに追加されました。 | ||
| /key: keyFile | keyFile に含まれる秘密キーを使用して、厳密な署名を持つ filename をコンパイルします。 | ||
| /key:@ keySource | keySource で生成された秘密キーを使用して、厳密な署名を持つ filename をコンパイルします。 | ||
| /listing | 標準出力にリスティング ファイルを生成します。このオプションを省略すると、リスティング ファイルは生成されません。 このパラメータは、.NET Framework Version 2.0 以降ではサポートされません。 | ||
| /mdv=versionString | メタデータのバージョン文字列を設定します。 .NET Framework Version 2.0 で新たに追加されました。 | ||
| /msv=major.minor | メタデータのストリーム バージョンを設定します。ここで、major と minor は整数です。 .NET Framework Version 2.0 で新たに追加されました。 | ||
| /noautoinherit | 基本クラスが指定されていない場合、Object からの既定の継承を無効にします。 .NET Framework Version 2.0 で新たに追加されました。 | ||
| /nocorstub | CORExeMain スタブの生成を抑止します。 .NET Framework Version 2.0 で新たに追加されました。 | ||
| /nologo | Microsoft 著作権情報を表示しません。 | ||
| /output: file.ext | 出力ファイルの名前と拡張子を指定します。既定では、出力ファイルの名前は最初のソース ファイルの名前と同じです。既定の拡張子は .exe です。/dll オプションを指定した場合の既定の拡張子は .dll です。
| ||
| /optimize | 長いインストラクションを短く最適化します。たとえば br を br.s にします。 .NET Framework Version 2.0 で新たに追加されました。 | ||
| /pe64 | 64 ビットのイメージ (PE32+) を作成します。 ターゲット プロセッサを指定しない場合、既定は /itanium です。 .NET Framework Version 2.0 で新たに追加されました。 | ||
| /pdb | デバッグ情報の追跡を有効にせずに PDB ファイルを作成します。 .NET Framework Version 2.0 で新たに追加されました。 | ||
| /quiet | クワイエット モードを指定します。アセンブリの進行状況はレポートされません。 | ||
| /resource: file.res | 指定した *.res 形式のリソース ファイルを生成される .exe ファイルまたは .dll ファイルに組み込みます。/resource オプションで指定できる .res ファイルは 1 つだけです。 | ||
| /stack=stackSize | NT Optional ヘッダーの SizeOfStackReserve 値を stackSize に設定します。 .NET Framework Version 2.0 で新たに追加されました。 | ||
| /stripreloc | ベースの再配置が不要であることを指定します。 .NET Framework Version 2.0 で新たに追加されました。 | ||
| /subsystem= integer | NT オプション ヘッダーのサブシステムを integer で指定された値に設定します。このコマンドは、ファイルに指定されている .subsystem IL ディレクティブをオーバーライドします。有効な integer の値の一覧については、winnt.h で IMAGE_SUBSYSTEM を参照してください。 | ||
| /x64 | ターゲット プロセッサとして 64 ビットの AMD プロセッサを指定します。 イメージのビット数を指定しない場合、既定は /pe64 です。 .NET Framework Version 2.0 で新たに追加されました。 | ||
| /? | このツールのコマンド構文とオプションを表示します。 |
メモ |
|---|
| Ilasm.exe に関するすべてのオプションでは大文字と小文字が区別されず、先頭の 3 文字で認識されます。たとえば、/lis は /listing と等価であり、/res:myresfile.res は /resource:myresfile.res と等価です。引数を伴うオプションの場合は、オプションと引数の間に区切り記号としてコロン (:) または等号 (=) を挿入できます。たとえば、/output:file.ext は /output=file.ext と等価です。 |
MSIL アセンブラは、MSIL ジェネレータを設計および実装するツールの販売元を支援します。ツールとコンパイラの開発者は、Ilasm.exe を使用することで、PE ファイル形式での MSIL の出力にかかわることなく、MSIL とメタデータの生成に集中できます。
C# および Visual Basic など、ランタイムを対象とした他のコンパイラと同様に、Ilasm.exe も中間オブジェクト ファイルを生成しません。このため、PE ファイルを形成するためのリンク ステージが必要ありません。
MSIL アセンブラは、すべての既存メタデータ、およびランタイムを対象としたプログラミング言語の MSIL 機能を表現できます。このため、このようなプログラミング言語で記述されたマネージ コードを MSIL アセンブラで適切に表現し、Ilasm.exe でコンパイルできます。
Ilasm.exe と、その対をなすツール Ildasm.exe を併用できます。Ildasm.exe は MSIL コードを含む PE ファイルを使用して、Ilasm.exe に対する入力として適したテキスト ファイルを作成します。これは、必ずしもすべてのランタイム メタデータ属性をサポートしないプログラミング言語で記述されたコードをコンパイルするときなどに便利です。コードをコンパイルし、その出力を Ildasm.exe で実行した後、生成された MSIL テキスト ファイルを手作業で編集して足りない属性を追加できます。このテキスト ファイルを Ilasm.exe で実行すると、最終的な実行可能ファイルを生成できます。
この方法を使用して、異なるコンパイラによって生成された複数の PE ファイルから 1 つの PE ファイルを生成することもできます。
メモ |
|---|
| 現時点では、埋め込みのネイティブ コード (たとえば Visual C++ で生成された PE ファイル) を含む PE ファイルについては、この手法を使用できません。 |
Ildasm.exe と Ilasm.exe を組み合わせて使用するときの処理をできる限り正確にするため、アセンブラではある種の単純な最適化処理が実行されません。具体的には、短形式または長形式の命令を使用するかどうかが推測されません。たとえば、長形式のエンコードがユーザーによって MSIL ソース内に書き込まれた (または他のコンパイラによって出力された) 場合でも、アセンブラは長形式のエンコードを短形式で代替できるかどうかを判断しません。短形式のエンコードが望ましい場合は、明示的に短形式で書く必要があります。ただし、可能な場合は、アセンブラは範囲外条件に関するチェックを実行します。
メモ |
|---|
| Ildasm.exe はディスク上のファイルについてだけ動作します。グローバル アセンブリ キャッシュ内にインストールされたファイルについては動作しません。 MSIL の文法の詳細については、.NET Framework SDK の asmparse.grammar ファイルを参照してください。 |
MSIL ファイル myTestFile.il をアセンブルして実行可能ファイル myTestFile.exe. を生成するコマンドを次に示します。
ilasm myTestFile
MSIL ファイル myTestFile.il をアセンブルして .dll ファイル myTestFile.dll を生成するコマンドを次に示します。
ilasm myTestFile /dll
MSIL ファイル myTestFile.il をアセンブルして .dll ファイル myNewTestFile.dll を生成するコマンドを次に示します。
ilasm myTestFile /dll /output:myNewTestFile.dll
コンソールに "Hello World!" を表示する簡単なアプリケーションのコード例を次に示します。このコードのコンパイル後に Ildasm.exe ツールを使用して、MSIL ファイルを生成できます。
using System; public class Hello { public static void Main(String[] args) { Console.WriteLine("Hello World!"); } }
次の MSIL コードの例は、前の C# のコード例に対応しています。MSIL アセンブラ (Ilasm.exe) ツールを使用すると、このコードをアセンブリにコンパイルできます。MSIL コードと C# コードの例は、共にコンソールに "Hello World!" を表示します。
// Metadata version: v2.0.50215
.assembly extern mscorlib
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
.ver 2:0:0:0
}
.assembly sample
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 )
.hash algorithm 0x00008004
.ver 0:0:0:0
}
.module sample.exe
// MVID: {A224F460-A049-4A03-9E71-80A36DBBBCD3}
.imagebase 0x00400000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003 // WINDOWS_CUI
.corflags 0x00000001 // ILONLY
// Image base: 0x02F20000
// =============== CLASS MEMBERS DECLARATION ===================
.class public auto ansi beforefieldinit Hello
extends [mscorlib]System.Object
{
.method public hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 13 (0xd)
.maxstack 8
IL_0000: nop
IL_0001: ldstr "Hello World!"
IL_0006: call void [mscorlib]System.Console::WriteLine(string)
IL_000b: nop
IL_000c: ret
} // end of method Hello::Main
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Code size 7 (0x7)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: ret
} // end of method Hello::.ctor
} // end of class Hello
