Dela via


Ilasm.exe (IL Assembler)

IL Assembler genererar en portabel körbar fil (PE) från sammansättningen mellanliggande språk (IL). (Mer information om IL finns i Hanterad körningsprocess.) Du kan köra den resulterande körbara filen, som innehåller IL och nödvändiga metadata, för att avgöra om IL:en fungerar som förväntat.

Det här verktyget installeras automatiskt med Visual Studio. Om du vill köra verktyget använder du Visual Studio Developer Command Prompt eller Visual Studio Developer PowerShell.

Skriv följande vid kommandotolken:

Syntax

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

Parametrar

Argument beskrivning
filename Namnet på .il-källfilen. Den här filen består av metadatadeklarationsdirektiv och symboliska IL-instruktioner. Flera källfilargument kan anges för att skapa en enda PE-fil med Ilasm.exe. Obs! Se till att den sista kodraden i .il-källfilen antingen har avslutande tomt utrymme eller ett radslutstecken.
Alternativ Description
/32bitpreferred Skapar en 32-bitars föredragen avbildning (PE32).
/justering: integer Anger FileAlignment till det värde som anges av integer i NT-valfritt huvud. Om .alignment IL-direktivet anges i filen åsidosätter det här alternativet det.
/appcontainer Genererar en .dll - eller .exe-fil som körs i Windows-appcontainern som utdata.
/arm Anger ARM (Advanced RISC Machine) som målprocessor.

Om ingen bildbitness anges är standardvärdet /32bitpreferred.
/bas: integer Anger ImageBase till det värde som anges av integer i NT Optional-huvudet. Om IL-direktivet .imagebase anges i filen åsidosätter det här alternativet det.
/klocka Mäter och rapporterar följande kompileringstider i millisekunder för den angivna .il-källfilen:

Total körning: Den totala tid som ägnas åt att utföra alla specifika åtgärder som följer.

Start: Läser in och öppnar filen.

Avger MD: Genererar metadata.

Referens till def-lösning: Matcha referenser till definitioner i filen.

CEE-filgenerering: Generera filbilden i minnet.

PE-filskrivning: Skriva bilden till en PE-fil.
/debug[:IMPL|OPT] Innehåller felsökningsinformation (lokala variabel- och argumentnamn och radnummer). Skapar en PDB-fil.

/debug utan ytterligare värde inaktiverar JIT-optimering och använder sekvenspunkter från PDB-filen.

IMPL inaktiverar JIT-optimering och använder implicita sekvenspunkter.

OPT aktiverar JIT-optimering och använder implicita sekvenspunkter.
/Dll Genererar en .dll fil som utdata.
/Enc: file Skapar Redigera och fortsätt deltan från den angivna källfilen.

Det här argumentet är endast för akademiskt bruk och stöds inte för kommersiell användning.
/exe Skapar en körbar fil som utdata. Det här är standardinställningen.
/flaggor: integer Anger ImageFlags till det värde som anges av integer i den gemensamma språkkörningsrubriken. Om .corflags IL-direktivet anges i filen åsidosätter det här alternativet det. Se CorHdr.h, COMIMAGE_FLAGS för en lista över giltiga värden för heltal.
/vika Viker identiska metodkroppar i en.
/highentropyva Genererar en körbar utdata som stöder slumpmässig layout för hög entropiadressutrymme (ASLR). (Standard för /appcontainer.)
/inbegripa: includePath Anger en sökväg för att söka efter filer som ingår i #include.
/itanium Anger Intel Itanium som målprocessor.

Om ingen bildbitness anges är standardvärdet /pe64.
/nyckel: keyFile Kompilerar filename med en stark signatur med hjälp av den privata nyckeln som finns i keyFile.
/nyckel: @keySource Kompilerar filename med en stark signatur med hjälp av den privata nyckeln som skapas på keySource.
/Lista Skapar en listfil på standardutdata. Om du utelämnar det här alternativet skapas ingen listfil.

Den här parametern stöds inte i .NET Framework 2.0 eller senare.
/mdv: versionString Anger metadataversionssträngen.
/msv: major.minor Anger metadataströmversionen, var major och minor är heltal.
/noautoinherit Inaktiverar standardarv från Object när ingen basklass har angetts.
/nocorstub Undertrycker generering av CORExeMain-stub.
/nologo Undertrycker microsofts startbanderoll.
/utdata: file.ext Anger utdatafilens namn och tillägg. Som standard är namnet på utdatafilen samma som namnet på den första källfilen. Standardtillägget är .exe. Om du anger alternativet /dll är standardtillägget .dll. Obs! Om du anger /output:myfile.dll anges inte alternativet /dll. Om du inte anger /dll blir resultatet en körbar fil med namnet myfile.dll.
/optimera Optimerar långa instruktioner till korta. Till exempel br till br.s.
/pe64 Skapar en 64-bitars bild (PE32+).

Om ingen målprocessor har angetts är /itaniumstandardvärdet .
/pdb Skapar en PDB-fil utan att aktivera felsökningsinformationsspårning.
/stilla Anger tyst läge. rapporterar inte sammansättningsstatus.
/resurs: file.res Innehåller den angivna resursfilen i *.res-format i den resulterande .exe - eller .dll-filen . Endast en .res-fil kan anges med alternativet /resource .
/ssver: int.int Anger versionsnumret för undersystemet i det valfria NT-huvudet. För /appcontainer och /arm är det lägsta versionsnumret 6,02.
/stack: stackSize Anger värdet SizeOfStackReserve i NT Optional-huvudet till stackSize.
/stripreloc Anger att inga basflyttar behövs.
/delsystem: integer Anger undersystemet till det värde som anges av integer i NT Optional-huvudet. Om .subsystem IL-direktivet anges i filen åsidosätter det här kommandot det. Se winnt.h, IMAGE_SUBSYSTEM för en lista med giltiga värden för integer.
/x64 Anger en 64-bitars AMD-processor som målprocessor.

Om ingen bildbitness anges är standardvärdet /pe64.
/? Visar kommandosyntax och alternativ för verktyget.

Kommentar

Alla alternativ för Ilasm.exe är skiftlägesokänsliga och känns igen av de tre första bokstäverna. Till exempel motsvarar /lis /listing och /res:myresfile.res motsvarar /resource:myresfile.res. Alternativ som anger argument accepterar antingen ett kolon (:) eller ett likhetstecken (=) som avgränsare mellan alternativet och argumentet. Till exempel motsvarar /output:file.ext /output=file.ext.

Kommentarer

IL Assembler hjälper verktygsleverantörer att utforma och implementera IL-generatorer. Med hjälp av Ilasm.exe kan verktygs- och kompilatorutvecklare koncentrera sig på generering av IL och metadata utan att behöva generera IL i PE-filformatet.

På samma sätt som andra kompilatorer som riktar sig mot körningen, till exempel C# och Visual Basic, skapar Ilasm.exe inte mellanliggande objektfiler och kräver inte en länkningsfas för att bilda en PE-fil.

IL Assembler kan uttrycka alla befintliga metadata och IL-funktioner för de programmeringsspråk som är inriktade på körningen. På så sätt kan hanterad kod som skrivits på något av dessa programmeringsspråk uttryckas korrekt i IL Assembler och kompileras med Ilasm.exe.

Kommentar

Kompileringen kan misslyckas om den sista kodraden i .il-källfilen inte har något avslutande tomt utrymme eller ett radslutstecken.

Du kan använda Ilasm.exe tillsammans med dess tillhörande verktyg, Ildasm.exe. Ildasm.exe tar en PE-fil som innehåller IL-kod och skapar en textfil som är lämplig som indata för Ilasm.exe. Detta är till exempel användbart när du kompilerar kod på ett programmeringsspråk som inte stöder alla körningsmetadataattribut. När du har sammanställt koden och kört utdata via Ildasm.exe kan den resulterande IL-textfilen redigeras för hand för att lägga till de attribut som saknas. Du kan sedan köra textfilen via Ilasm.exe för att skapa en slutlig körbar fil.

Du kan också använda den här tekniken för att skapa en enskild PE-fil från flera PE-filer som ursprungligen genererades av olika kompilatorer.

Kommentar

För närvarande kan du inte använda den här tekniken med PE-filer som innehåller inbäddad intern kod (till exempel PE-filer som skapats av Visual C++).

För att göra den här kombinerade användningen av Ildasm.exe och Ilasm.exe så korrekt som möjligt ersätter inte assembleren korta kodningar för långa kodningar som du kanske har skrivit i dina IL-källor (eller som kan genereras av en annan kompilator). Använd alternativet /optimize för att ersätta korta kodningar där det är möjligt.

Kommentar

Ildasm.exe fungerar bara på filer på disk. Den fungerar inte på filer som är installerade i den globala sammansättningscacheminnet.

Mer information om grammatiken för IL finns i filen asmparse.grammar i Windows SDK.

Versionsinformation

Från och med .NET Framework 4.5 kan du koppla ett anpassat attribut till en gränssnittsimplementering med hjälp av kod som liknar följande:

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

Från och med .NET Framework 4.5 kan du ange en godtycklig blob för marskalk (binärt stort objekt) med hjälp av dess råa binära representation, enligt följande kod:

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

Mer information om grammatiken för IL finns i filen asmparse.grammar i Windows SDK.

Exempel

Följande kommando monterar IL-filen myTestFile.il och skapar den körbara myTestFile.exe.

ilasm myTestFile

Följande kommando monterar IL-filen myTestFile.il och skapar .dll-filen myTestFile.dll.

ilasm myTestFile /dll

Följande kommando monterar IL-filen myTestFile.il och skapar .dll-filen myNewTestFile.dll.

ilasm myTestFile /dll /output:myNewTestFile.dll

I följande kodexempel visas ett mycket enkelt program som visar "Hello World!" i konsolen. Du kan kompilera den här koden och sedan använda verktyget Ildasm.exe för att generera en IL-fil.

using System;

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

Följande IL-kodexempel motsvarar det tidigare C#-kodexemplet. Du kan kompilera den här koden till en sammansättning med verktyget IL Assembler. Kodexempel för både IL och C# visar "Hello World!" i konsolen.

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

Se även