Ilasm.exe (Assembler IL)

L'assembler IL genera un file eseguibile portabile (PE) dall'assembly del linguaggio intermedio (IL). Per altre informazioni su IL, vedere Processo di esecuzione gestito. È possibile eseguire il file eseguibile risultante, che contiene IL e i metadati necessari, per determinare se l'il servizio esegue come previsto.

Viene installato automaticamente con Visual Studio. Per eseguire lo strumento, usare il prompt dei comandi per sviluppatori di Visual Studio o Visual Studio Developer PowerShell.

Al prompt dei comandi digitare quanto segue:

Sintassi

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

Parametri

Argomento Descrizione
filename Nome del file di origine .il. Questo file è formato da direttive di dichiarazione di metadati e istruzioni IL simboliche. È possibile fornire più argomenti di file di origine per produrre un singolo file PE con Ilasm.exe. Nota: Assicurarsi che l'ultima riga di codice nel file di origine .il abbia spazio vuoto finale o un carattere end-of-line.
Opzione Descrizione
/32bitpreferred Crea un'immagine con preferenza per i 32 bit (PE32).
/Allineamento:integer Imposta FileAlignment sul valore specificato da integer nell'intestazione NT facoltativa. Se la direttiva IL .alignment è specificata nel file, questa opzione ne esegue l'override.
/appcontainer Produce un file.dll o .exe che viene eseguito nel contenitore dell'app di Windows, come output.
/Braccio Specifica Advanced RISC Machine (ARM) come processore di destinazione.

Se non viene specificato il numero di bit dell'immagine, viene utilizzata l'impostazione predefinita /32bitpreferred.
/Base:integer Imposta ImageBase sul valore specificato da integer nell'intestazione NT facoltativa. Se la direttiva IL .imagebase è specificata nel file, questa opzione ne esegue l'override.
/Orologio Misura e segnala i seguenti tempi di compilazione in millisecondi per il file di origine .il specificato:

Total Run: tempo totale impiegato per l'esecuzione di tutte le operazioni specifiche che seguono.

Startup: caricamento e apertura del file.

Emitting MD: emissione di metadati.

Ref to Def Resolution: risoluzione dei riferimenti nelle definizioni nel file.

CEE File Generation: generazione dell'immagine del file in memoria.

PE File Writing: scrittura dell'immagine in un file PE.
/debug[:IMPL|OPT] Include informazioni di debug (nomi di variabili locali e di argomenti e numeri di riga). Crea un file PDB.

Se si specifica/debug senza altri valori, viene disabilitata l'ottimizzazione JIT e vengono utilizzati i punti di sequenza dal file PDB.

IMPL disabilita l'ottimizzazione JIT e utilizza punti di sequenza impliciti.

OPT abilita l'ottimizzazione JIT e utilizza punti di sequenza impliciti.
/dll Produce un file .dll come output.
/Enc:file Crea file differenziali di Modifica e continuazione a partire dal file di origine specificato.

Questo argomento è esclusivamente per utilizzo didattico e non è supportato per un utilizzo commerciale.
/exe Produce un file eseguibile come output. Questo è il valore predefinito.
/Bandiere:integer Imposta ImageFlags sul valore specificato da integer nell'intestazione Common Language Runtime. Se la direttiva IL .corflags è specificata nel file, questa opzione ne esegue l'override. Per un elenco di valori validi per integer, vedere CorHdr.h, COMIMAGE_FLAGS.
/Piegare Raggruppa corpi di metodo identici in uno solo.
/highentropyva Genera in output un file eseguibile che supporta ASLR (Address Space Layout Randomization) a entropia elevata. Impostazione predefinita per /appcontainer.
/Includono:includePath Imposta un percorso per la ricerca di file inclusi con #include.
/Itanium Specifica Intel Itanium come processore di destinazione.

Se non viene specificato il numero di bit dell'immagine, viene utilizzata l'impostazione predefinita /pe64.
/Chiave:keyFile Compila filename con una firma sicura usando la chiave privata contenuta in keyFile.
/Chiave: @keySource Compila filename con una firma sicura usando la chiave privata prodotta in keySource.
/Elenco Produce un file di elenco sull'output standard. Se si omette questa opzione, non verrà prodotto alcun file di elenco.

Questo parametro non è supportato in .NET Framework 2.0 o versione successiva.
/Mdv:versionString Imposta la stringa di versione dei metadati.
/msv:major.minor Imposta la versione del flusso di metadati, dove major e minor sono numeri interi.
/noautoinherit Disabilita l'ereditarietà predefinita da Object quando non è specificata alcuna classe base.
/nocorstub Elimina la generazione dello stub CORExeMain.
/nologo Evita la visualizzazione del messaggio di avvio Microsoft.
/Output:file.ext Specifica il nome e l'estensione del file di output. Per impostazione predefinita, il nome del file di output corrisponde al nome del primo file di origine. L'estensione predefinita è .exe. Se si specifica l'opzione /dll , l'estensione predefinita è .dll. Nota: La specifica di /output:myfile.dll non imposta l'opzione /dll . Se non si specifica /dll, il risultato sarà un file eseguibile denominato myfile.dll.
/Ottimizzare Ottimizza le istruzioni long convertendole in short. Ad esempio, br viene convertito in br.s.
/pe64 Crea un'immagine a 64 bit (PE32+).

Se non è specificato il processore di destinazione, l'impostazione predefinita è /itanium.
/Pdb Crea un file PDB senza abilitare la traccia delle informazioni di debug.
/quiet Specifica la modalità non interattiva. Non visualizza informazioni sullo stato dell'assembly.
/Risorsa:file.res Include il file di risorse specificato nel formato *.res nel file di.exe o di.dllrisultante . È possibile specificare un unico file .res con l'opzione /resource .
/ssver:int.int Imposta il numero di versione del sottosistema nell'intestazione NT facoltativa. Per /appcontainer e /arm il numero minimo di versione è 6.02.
/Pila:stackSize Imposta su stackSizeil valore di SizeOfStackReserve nell'intestazione NT facoltativa.
/stripreloc Specifica che non sono necessarie rilocazioni di base.
/Sottosistema:integer Imposta il sottosistema sul valore specificato da integer nell'intestazione NT facoltativa. Se la direttiva IL .subsystem è specificata nel file, questo comando ne esegue l'override. Per un elenco di valori validi per integer, vedere winnt.h, IMAGE_SUBSYSTEM.
/x64 Specifica un processore AMD a 64 bit come processore di destinazione.

Se non viene specificato il numero di bit dell'immagine, viene utilizzata l'impostazione predefinita /pe64.
/? Visualizza la sintassi e le opzioni di comando dello strumento.

Nota

Tutte le opzioni per Ilasm.exe non fanno distinzione tra maiuscole e minuscole e sono riconosciute dalle prime tre lettere. Ad esempio, /lis equivale a /listing e /res:myresfile.res equivale a /resource:myresfile.res. Opzioni che specificano argomenti accettano due punti (:) o un segno di uguale (=) come separatore tra l'opzione e l'argomento . Ad esempio, /output:file.ext equivale a /output=file.ext.

Commenti

L'assembler IL consente ai fornitori di strumenti di progettare e implementare generatori IL. L'uso diIlasm.exe, gli sviluppatori di strumenti e compilatori possono concentrarsi sulla generazione di metadati e IL senza preoccuparsi di emettere IL nel formato di file PE.

Analogamente ad altri compilatori destinati al runtime, ad esempio C# e Visual Basic, Ilasm.exe non produce file oggetto intermedi e non richiede una fase di collegamento per formare un file PE.

L'assembler IL è in grado di esprimere tutte le funzionalità esistenti per IL e i metadati dei linguaggi di programmazione destinati al runtime. In questo modo, il codice gestito scritto in uno di questi linguaggi di programmazione può essere espresso in modo adeguato nell'assembler IL e compilato con Ilasm.exe.

Nota

È possibile che la compilazione abbia esito negativo se nell'ultima riga di codice del file di origine con estensione il non è presente uno spazio vuoto finale o un carattere di fine riga.

È possibile usare Ilasm.exe insieme al relativo strumento complementare ,Ildasm.exe. Ildasm.exe accetta un file PE che contiene il codice IL e crea un file di testo adatto come input per Ilasm.exe. Questo è utile, ad esempio, quando si compila codice in un linguaggio di programmazione che non supporta tutti gli attributi dei metadati del runtime. Dopo aver compilato il codice ed eseguito l'output tramite Ildasm.exe, il file di testo IL risultante può essere modificato manualmente per aggiungere gli attributi mancanti. È quindi possibile eseguire questo file di testo tramite il Ilasm.exe per produrre un file eseguibile finale.

È inoltre possibile ricorrere a questa tecnica per produrre un unico file PE sulla base di più file PE generati da diversi compilatori.

Nota

Attualmente non è possibile avvalersi di questa tecnica con file PE contenenti codice nativo incorporato, ad esempio file PE prodotti da Visual C++.

Per usare questa combinazione di Ildasm.exe e Ilasm.exe il più accurato possibile, per impostazione predefinita l'assembler non sostituisce le codifiche brevi per quelle lunghe che potrebbero essere state scritte nelle origini IL (o che potrebbero essere generate da un altro compilatore). Utilizzare l'opzione /optimize per sostituire le codifiche short quando possibile.

Nota

Ildasm.exe opera solo sui file su disco. e non su file installati nella Global Assembly Cache.

Per altre informazioni sulla grammatica di IL, vedere il file asmparse.grammar in Windows SDK.

Informazioni sulla versione

A partire da .NET Framework 4.5, è possibile collegare un attributo personalizzato a un'implementazione dell'interfaccia usando codice simile al seguente:

.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 )
      …

A partire da .NET Framework 4.5, è possibile specificare un BLOB di marshalling arbitrario (oggetto binario di grandi dimensioni) usando la relativa rappresentazione binaria non elaborata, come illustrato nel codice seguente:

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

Per altre informazioni sulla grammatica di IL, vedere il file asmparse.grammar in Windows SDK.

Esempio

Il comando che segue assembla il file IL myTestFile.il e produce l'eseguibile myTestFile.exe.

ilasm myTestFile

Il comando che segue assembla il file IL myTestFile.il e produce il file .dllmyTestFile.dll.

ilasm myTestFile /dll

Il comando che segue assembla il file IL myTestFile.il e produce il file .dllmyNewTestFile.dll.

ilasm myTestFile /dll /output:myNewTestFile.dll

Nell'esempio di codice riportato di seguito viene illustrata un'applicazione molto semplice che determina la visualizzazione della stringa "Hello World!" sulla console. È possibile compilare questo codice e quindi usare lo strumento Ildasm.exe per generare un file IL.

using System;

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

L'esempio di codice IL riportato di seguito corrisponde al precedente esempio di codice C#. È possibile compilare questo codice in un assembly mediante lo strumento IL Assembler. Entrambi gli esempi di codice IL e C# determinano la visualizzazione di "Hello World!" sulla console.

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

Vedi anche