Ilasm.exe (IL-Assembler)

Der IL-Assembler generiert eine portierbare ausführbare Datei (Portable Executable, PE) aus der IL-Assembly (Intermediate Language, Zwischensprache). Weitere Informationen über die Zwischensprache finden Sie unter Der verwaltete Ausführungsprozess. Die erstellte ausführbare Datei, die IL und die erforderlichen Metadaten enthält, können Sie ausführen, um zu überprüfen, ob die IL wie erwartet funktioniert.

Dieses Tool wird automatisch mit Visual Studio installiert. Um das Tool auszuführen, verwenden Sie die Developer-Eingabeaufforderung von Visual Studio oder Visual Studio Developer PowerShell.

Geben Sie an der Eingabeaufforderung Folgendes ein:

Syntax

ilasm [options] filename [[options]filename...]

Parameter

Argument BESCHREIBUNG
filename Der Name der IL-Quelldatei. Diese Datei besteht aus Direktiven für die Deklaration von Metadaten und symbolischen IL-Anweisungen. Zum Erstellen einer einzelnen PE-Datei mithilfe von Ilasm.exe können mehrere Quelldateiargumente angegeben werden. Hinweis: Vergewissern Sie sich, dass die letzte Codezeile in der IL-Quelldatei entweder ein nachgestelltes Leerzeichen oder ein Zeilenendezeichen besitzt.
Option BESCHREIBUNG
/32bitpreferred Erstellt ein Abbild im PE32-Format (vorzugweise 32 Bit).
/alignment: integer Legt FileAlignment auf den Wert fest, der im NT Optional-Header per integer angegeben ist. Wenn die .alignment-IL-Direktive in der Datei angegeben ist, wird sie durch diese Option überschrieben.
/appcontainer Erstellt als Ausgabe eine DLL- oder EXE-Datei, die im Windows-App-Container ausgeführt wird.
/arm Gibt die ARM (Advanced RISC Machine) als Zielprozessor an.

Wenn keine Bitanzahl für das Abbild angegeben wird, lautet der Standardwert /32bitpreferred.
/base: integer Legt ImageBase auf den Wert fest, der im NT Optional-Header per integer angegeben ist. Wenn die .imagebase-IL-Direktive in der Datei angegeben ist, wird sie durch diese Option überschrieben.
/clock Erfasst und berichtet die folgenden Kompilierungszeiten (in Millisekunden) für die angegebene IL-Quelldatei:

Total Run: Die gesamte für die Ausführung aller nachfolgenden spezifischen Vorgänge benötigte Zeit.

Startup: Laden und Öffnen der Datei.

Emitting MD: Ausgabe von Metadaten.

Ref to Def Resolution: Auflösen von Verweisen auf Definitionen in der Datei.

CEE File Generation: Generieren des Dateiimages im Arbeitsspeicher.

PE File Writing: Schreiben des Images in eine PE-Datei.
/debug[:IMPL|OPT] Schließt Debuginformationen (Namen lokaler Variablen und Argumente sowie Zeilennummern) ein. Erstellt eine PDB-Datei.

/debug ohne zusätzlichen Wert deaktiviert die JIT-Optimierung und verwendet Sequenzpunkte aus der PDB-Datei.

IMPL deaktiviert die JIT-Optimierung und verwendet implizite Sequenzpunkte.

OPT aktiviert die JIT-Optimierung und verwendet implizite Sequenzpunkte.
/dll Erzeugt eine DLL-Datei als Ausgabe.
/enc: file Erstellt Edit-and-Continue-Deltas aus der angegebenen Quelldatei.

Die Verwendung dieses Arguments ist nur zu akademischen Zwecken vorgesehen. Ein Einsatz zu kommerziellen Zwecken wird nicht unterstützt.
/exe Erstellt eine ausführbare Datei als Ausgabe. Dies ist die Standardeinstellung.
/flags: integer Legt ImageFlags“ auf den Wert, der im Common Language Runtime-Header durch integer angegeben wird. Wenn die .corflags-IL-Direktive in der Datei angegeben ist, wird sie durch diese Option überschrieben. Eine Liste der für integer gültigen Werte finden Sie unter "CorHdr.h, COMIMAGE_FLAGS".
/fold Fasst identische Methodentexte in einem Text zusammen.
/highentropyva Erstellt eine ausführbare Ausgabedatei, die ASLR mit hoher Entropie (Address Space Layout Randomization, Zufällige Anordnung des Layouts des Adressraums) unterstützt. (Standardeinstellung für /appcontainer.)
/include: includePath Legt einen Suchpfad für in #includeaufgeführte Dateien fest.
/itanium Gibt Intel Itanium als Zielprozessor an.

Wenn keine Bitanzahl für das Abbild angegeben wird, lautet der Standardwert /pe64.
/key: keyFile Kompiliert filename mit einer starken Signatur unter Verwendung des privaten Schlüssels in keyFile.
/key: @keySource Kompiliert filename mit einer starken Signatur unter Verwendung des bei keySource erstellten privaten Schlüssels.
/listing Erstellt eine Listingdatei in der Standardausgabe. Wenn Sie diese Option weglassen, wird keine Listingdatei erstellt.

In .NET Framework 2.0 (oder höher) wird dieser Parameter nicht unterstützt.
/mdv: versionString Legt die Zeichenfolge der Metadatenversion fest.
/msv: major.minor Legt die Version des Metadatenstreams fest, wobei major und minor ganze Zahlen sind.
/noautoinherit Deaktiviert die Standardvererbung von Object , wenn keine Basisklasse angegeben ist.
/nocorstub Unterdrückt die Generierung des CORExeMain-Stubs.
/nologo Unterdrückt die Anzeige des Startbanners von Microsoft.
/output: file.ext Gibt den Namen und die Erweiterung der Ausgabedatei an. In der Standardeinstellung ist der Name der Ausgabedatei mit dem der ersten Quelldatei identisch. Die Standarderweiterung ist .exe. Wenn Sie die Option /dll angeben, lautet die Standarderweiterung .dll. Hinweis: Durch Angabe von „ /output:myfile.dll“ wird die Option /dll nicht festgelegt. Wenn Sie /dll nicht angeben, wird eine ausführbare Datei mit dem Namen myfile.dll erstellt.
/optimize Optimiert lange Anweisungen in kurze Anweisungen. Beispiel: br wird zu br.s.
/pe64 Erstellt ein 64-Bit-Abbild (PE32+).

Wenn kein Zielprozessor angegeben wird, lautet der Standardwert /itanium.
/pdb Erstellt eine PDB-Datei, ohne das Nachverfolgen von Debuginformationen zu aktivieren.
/quiet Gibt den stillen Modus an, bei dem keine Angaben zum Verlauf der Assembly gemeldet werden.
/resource: file.res Bezieht die angegebene Ressourcendatei im Format „*.res“ in die resultierende EXE- oder DLL-Datei ein. Mit der Option /resource kann nur eine einzige RES-Datei angegeben werden.
/ssver: int.int Legt die Subsystemversionsnummer im NT Optional-Header fest. Für /appcontainer und /arm lautet die minimale Versionsnummer 6.02.
/stack: stackSize Legt den SizeOfStackReserve-Wert im NT Optional-Header auf stackSizefest.
/stripreloc Gibt an, dass Basisumsetzungen nicht erforderlich sind.
/subsystem: integer Legt „subsystem“ auf den Wert fest, der im NT Optional-Header durch integer angegeben wird. Wenn die .subsystem-IL-Direktive in der Datei angegeben ist, wird sie durch diesen Befehl überschrieben. Eine Liste der gültigen Werte für integer finden Sie unter „winnt.h, IMAGE_SUBSYSTEM“.
/x64 Gibt einen 64-Bit-AMD-Prozessor als Zielprozessor an.

Wenn keine Bitanzahl für das Abbild angegeben wird, lautet der Standardwert /pe64.
/? Zeigt Befehlssyntax und Optionen für das Tool an.

Hinweis

Bei allen Optionen für Ilasm.exe wird nicht zwischen Groß- und Kleinschreibung unterschieden, und sie werden anhand der ersten drei Buchstaben erkannt. So ist zum Beispiel /lis das Gleiche wie /listing, und /res:myresfile.res entspricht /resource: myresfile.res. Optionen, die Argumente angeben, können entweder einen Doppelpunkt (:) oder ein Gleichheitszeichen (=) als Trennzeichen zwischen der Option und dem Argument enthalten. So wären zum Beispiel /output: file.ext und /output= =file.ext identisch.

Hinweise

Der IL-Assembler unterstützt Anbieter von Tools beim Entwerfen und Implementieren von IL-Generatoren. Durch die Verwendung von Ilasm.exe können sich Entwickler von Tools und Compilern auf die Generierung von IL und Metadaten konzentrieren, ohne sich um IL-Ausgaben im PE-Dateiformat kümmern zu müssen.

Ähnlich wie andere Laufzeitcompiler (z.B. C# und Visual Basic) erstellt Ilasm.exe keine Objektzwischendateien und benötigt keine Verknüpfungsstufe zum Erstellen einer PE-Datei.

Der IL-Assembler kann alle vorhandenen Metadaten und IL-Funktionen der Programmiersprachen ausdrücken, die die Laufzeit unterstützen. Dadurch kann verwalteter Code, der in einer dieser Programmiersprachen geschrieben wurde, im IL-Assembler adäquat ausgedrückt und mit Ilasm.exe kompiliert werden.

Hinweis

Wenn die letzte Codezeile in der IL-Quelldatei weder ein nachgestelltes Leerzeichen noch ein Zeilenendezeichen besitzt, kann die Kompilierung fehlschlagen.

Sie können Ilasm.exe zusammen mit dem zugehörigen Tool Ildasm.exe verwenden. Ildasm.exe nimmt eine PE-Datei mit IL-Code entgegen und erstellt eine Textdatei, die als Eingabe für Ilasm.exe geeignet ist. Dies ist zum Beispiel nützlich, wenn Code in einer Programmiersprache programmiert werde soll, die nicht alle Attribute der Metadaten der Laufzeit unterstützt. Nachdem der Code kompiliert und die Ausgabe über Ildasm.exe verarbeitet wurde, kann die resultierende IL-Textdatei manuell bearbeitet werden, um die fehlenden Attribute hinzuzufügen. Anschließend können Sie diese Textdatei per Ilasm.exe verarbeiten, um eine endgültige ausführbare Datei zu erstellen.

Mit diesem Verfahren können Sie auch eine einzelne PE-Datei aus mehreren PE-Dateien erstellen, die von unterschiedlichen Compilern generiert wurden.

Hinweis

Für PE-Dateien, die eingebetteten systemeigenen Code enthalten (z. B. von Visual C++ erstellte PE-Dateien), ist dieses Verfahren gegenwärtig jedoch nicht geeignet.

Damit dieses Zusammenspiel von Ildasm.exe und Ilasm.exe so exakt wie möglich erfolgt, ersetzt der Assembler lange Codierungen (die Sie möglicherweise in Ihren IL-Quellen geschrieben haben oder die aus einem anderen Compiler ausgegeben wurden) standardmäßig nicht durch kurze Codierungen. Verwenden Sie die Option /optimize , um kurze Codierungen nach Möglichkeit zu ersetzen.

Hinweis

Ildasm.exe kann nur für Dateien auf der Festplatte verwendet werden. Bei Dateien, die im globalen Assemblycache installiert sind, funktioniert dieses Tool nicht.

Weitere Informationen zur Grammatik von IL finden Sie in der Datei „asmparse.grammar“ im Windows SDK.

Versionsinformationen

Ab .NET Framework 4.5 können Sie ein benutzerdefiniertes Attribut an eine Schnittstellenimplementierung anfügen, indem Sie Code verwenden, der in etwa wie folgt aussieht:

.class interface public abstract auto ansi IMyInterface
{
  .method public hidebysig newslot abstract virtual
    instance int32 method1() cil managed
  {
  } // end of method IMyInterface::method1
} // end of class IMyInterface
.class public auto ansi beforefieldinit MyClass
  extends [mscorlib]System.Object
  implements IMyInterface
  {
    .interfaceimpl type IMyInterface
    .custom instance void
      [mscorlib]System.Diagnostics.DebuggerNonUserCodeAttribute::.ctor() = ( 01 00 00 00 )
      …

Ab .NET Framework 4.5 können Sie ein beliebiges Marshall-BLOB (Binary Large Object) angeben, indem Sie die entsprechenden unformatierten Binärdaten wie im folgenden Code gezeigt angeben:

.method public hidebysig abstract virtual
        instance void
        marshal({ 38 01 02 FF })
        Test(object A_1) cil managed

Weitere Informationen zur Grammatik von IL finden Sie in der Datei „asmparse.grammar“ im Windows SDK.

Beispiele

Der folgende Befehl assembliert die IL-Datei myTestFile.il und erstellt die ausführbare Datei myTestFile.exe.

ilasm myTestFile

Der folgende Befehl assembliert die IL-Datei myTestFile.il und erstellt die DLL-Datei myTestFile.dll.

ilasm myTestFile /dll

Der folgende Befehl assembliert die IL-Datei myTestFile.il und erstellt die DLL-Datei myNewTestFile.dll.

ilasm myTestFile /dll /output:myNewTestFile.dll

Im folgenden Codebeispiel wird eine sehr einfache Anwendung gezeigt, die "Hello World!" auf der Konsole aus. Sie können diesen Code kompilieren und dann das Tool Ildasm.exe verwenden, um eine IL-Datei zu generieren.

using System;

public class Hello
{
    public static void Main(String[] args)
    {
        Console.WriteLine("Hello World!");
    }
}

Das folgende IL-Codebeispiel entspricht dem vorherigen C#-Codebeispiel. Sie können diesen Code mithilfe des IL Assembler-Tools in eine Assembly kompilieren. Sowohl der IL- als auch der C#-Beispielcode geben "Hello World!" auf der Konsole aus.

// 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

Siehe auch