Ilasm.exe (Asembler IL)

Asembler IL generuje przenośny plik wykonywalny (PE) z zestawu języka pośredniego (IL). (Aby uzyskać więcej informacji na temat IL, zobacz Managed Execution Process (Zarządzany proces wykonywania). Możesz uruchomić wynikowy plik wykonywalny, który zawiera il i wymagane metadane, aby określić, czy il działa zgodnie z oczekiwaniami.

To narzędzie jest instalowane automatycznie z programem Visual Studio. Aby uruchomić narzędzie, użyj programu Visual Studio wiersz polecenia dla deweloperów lub Visual Studio Developer PowerShell.

W wierszu polecenia wpisz następujące polecenie:

Składnia

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

Parametry

Argument Opis
filename Nazwa pliku źródłowego il. Ten plik zawiera dyrektywy deklaracji metadanych i symboliczne instrukcje języka IL. Można dostarczyć wiele argumentów pliku źródłowego, aby utworzyć pojedynczy plik PE zIlasm.exe. Uwaga: Upewnij się, że ostatni wiersz kodu w pliku źródłowym il zawiera spację końcową lub znak końca wiersza.
Opcja Opis
/32bitpreferred Tworzy obraz 32-bitowy (PE32).
/alignment:integer Ustawia FileAlignment do wartości określonej przez w integer nagłówku NT opcjonalne. Jeśli dyrektywa języka IL .alignment została określona w pliku, ta opcja zastępuje ją.
/appcontainer Tworzy plik .dll lub.exe uruchamiany w kontenerze Windows jako dane wyjściowe.
/arm Określa procesor Advanced RISC Machine (ARM) jako procesor docelowy.

Jeśli nie określono bitowości obrazu, wartość domyślna to /32bitpreferred.
/base:integer Ustawia ImageBase wartość określoną przez w integer nagłówku NT opcjonalne. Jeśli dyrektywa języka IL .imagebase została określona w pliku, ta opcja zastępuje ją.
/clock Mierzy i raportuje następujące czasy kompilacji (w milisekundach) dla określonego pliku źródłowego il:

Łączna liczba przebiegów: łączny czas spędzony na wykonywaniu wszystkich poszczególnych operacji.

Uruchamianie: ładowanie i otwieranie pliku.

Emitowanie MD: emitowanie metadanych.

Ref to Def Resolution: Rozpoznawanie odwołań do definicji w pliku.

Generowanie plików CEE: generowanie obrazu pliku w pamięci.

Pe File Writing (Zapisywanie plików PE): zapisywanie obrazu w pliku PE.
/debug[:IMPLOPT|] Dołącza informacje o debugowaniu (zmienne lokalne, nazwy argumentów i numery wierszy). Tworzy plik PDB.

/debug bez dodatkowych wartości wyłącza optymalizację JIT i używa punktów sekwencji z pliku PDB.

IMPL wyłącza optymalizację JIT i używa niejawnych punktów sekwencji.

Opt umożliwia optymalizację JIT i używa niejawnych punktów sekwencji.
/dll Tworzy plik .dll jako dane wyjściowe.
/enc:file Tworzy plik różnic Edytuj-i-Kontynuuj z określonego pliku źródłowego.

Ten argument jest tylko do użytku akademickiego i nie jest obsługiwany w użytku komercyjnym.
/exe Tworzy plik wykonywalny jako dane wyjściowe. Jest to opcja domyślna.
/flags:integer Ustawia ImageFlags wartość określoną przez w integer nagłówku środowiska uruchomieniowego języka wspólnego. Jeśli dyrektywa języka IL .corflags została określona w pliku, ta opcja zastępuje ją. Zobacz CorHdr.h, COMIMAGE_FLAGS, aby uzyskać listę prawidłowych wartości liczb całkowitych.
/fold Składa identyczne treści metod w jedną.
/highentropyva Tworzy wyjściowy plik wykonywalny, który obsługuje generowanie losowe układów przestrzeni adresowej (ASLR) o wysokiej entropii. (Wartość domyślna dla /appcontainer).
/include:includePath Ustawia ścieżkę do wyszukiwania plików dołączonych do .#include
/itanium Określa procesor Intel Itanium jako procesor docelowy.

Jeśli nie określono bitowości obrazu, wartość domyślna to /pe64.
/key:keyFile Kompiluje filename przy użyciu silnego podpisu przy użyciu klucza prywatnego zawartego w .keyFile
/key: @keySource Kompiluje filename przy użyciu silnego podpisu przy użyciu klucza prywatnego kompilowane w .keySource
/listing Tworzy plik listy w standardowym wyjściu. Jeśli ta opcja zostanie pominięta, plik listy nie zostanie utworzony.

Ten parametr nie jest obsługiwany w programie .NET Framework 2.0 i nowszych.
/mdv:versionString Ustawia ciąg wersji metadanych.
/msv:major.minor Ustawia wersję strumienia metadanych, gdzie i majorminor są liczbami całkowitymi.
/noautoinherit Wyłącza domyślne dziedziczenie z, Object gdy nie określono klasy bazowej.
/nocorstub Powoduje pominięcie generowania procedury wejścia CORExeMain.
/nologo Pomija wyświetlanie transparentu startowego firmy Microsoft.
/output:file.ext Określa nazwę i rozszerzenie pliku wyjściowego. Domyślnie nazwa pliku wyjściowego jest taka sama jak nazwa pierwszego pliku źródłowego. Domyślne rozszerzenie to .exe. Jeśli określisz /dll opcji, domyślne rozszerzenie jest .dll. Uwaga: Określanie /output:myfile.dll nie ustawia opcji /dll . Jeśli nie określisz /dll, wynik będzie plik wykonywalny o nazwie myfile.dll.
/Optimize Optymalizuje długie instrukcje, co powoduje zamianę ich na krótkie. Na przykład do br .br.s
/pe64 Tworzy obraz 64-bitowy (PE32+).

Jeśli nie określono procesora docelowego, wartość domyślna to /itanium.
/pdb Tworzy plik PDB bez włączania śledzenia informacji o debugowaniu.
/quiet Określa tryb cichy; nie zgłasza postępów zestawu.
/resource:file.res Zawiera określony plik zasobów w formacie *.res w wynikowym .exe lub.dll pliku. Za pomocą opcji /resource można określić tylko jeden plik res.
/ssver:int.int Ustawia numer wersji podsystemu w opcjonalnym nagłówku NT. W przypadku /appcontaineri /arm minimalny numer wersji to 6.02.
/stack:stackSize Ustawia wartość SizeOfStackReserve w opcjonalnym nagłówku NT na stackSize.
/stripreloc Określa, że nie są potrzebne relokacje podstawowe.
/subsystem:integer Ustawia podsystemu wartość określoną przez w integer nagłówku NT opcjonalne. Jeśli dyrektywa języka IL .subsystem została określona w pliku, to polecenie zastępuje ją. Zobacz winnt.h, IMAGE_SUBSYSTEM, aby uzyskać listę prawidłowych wartości dla integer.
/x64 Określa 64-bitowy procesor firmy AMD jako procesor docelowy.

Jeśli nie określono bitowości obrazu, wartość domyślna to /pe64.
/? Wyświetla składnię polecenia i opcje narzędzia.

Uwaga

Wszystkie opcjeIlasm.exesą bez uwzględniania liter i rozpoznawane przez pierwsze trzy litery. Na przykład /lis jest odpowiednikiem /listing i/res:myresfile.res jest odpowiednikiem /resource:myresfile.res. Opcje określające argumenty akceptują dwukropek (:) lub znak równości (=) jako separator między opcją a argumentem. Na przykład /output:file.ext jest odpowiednikiem /outputfile.ext=.

Uwagi

Program IL Assembler umożliwia dostawcom narzędzi projektowanie i implementowanie generatorów języka IL. Korzystając Ilasm.exe, deweloperzy narzędzi i kompilatora mogą skoncentrować się na generowaniu il i metadanych bez konieczności emitowania języka IL w formacie pliku PE.

Podobnie jak w przypadku innych kompilatorów, które są docelowe dla środowiska uruchomieniowego, takich jak C# i Visual Basic, program Ilasm.exe nie generuje plików obiektów pośrednich i nie wymaga etapu łączenia do tworzenia pliku PE.

Program IL Assembler może wyrazić wszystkie istniejące metadane i funkcje IL języków programowania, które są przeznaczone dla środowiska uruchomieniowego. Dzięki temu kod zarządzany napisany w dowolnym z tych języków programowania może być odpowiednio wyrażany w aserze IL i kompilowany za pomocąIlasm.exe.

Uwaga

Kompilacja może się nie powieść, jeśli ostatni wiersz kodu w pliku źródłowym il nie kończy się znakiem odstępu ani znakiem końca wiersza.

Możesz użyć Ilasm.exe w połączeniu z jego narzędziem towarzyszącym ,Ildasm.exe. Ildasm.exe pobiera plik PE zawierający kod IL i tworzy plik tekstowy odpowiedni jako dane wejściowe dla Ilasm.exe. Jest to przydatne na przykład podczas kompilowania kodu w języku programowania, który nie obsługuje wszystkich atrybutów metadanych środowiska uruchomieniowego. Po skompilowaniu kodu i uruchomieniu danych wyjściowych za pośrednictwem Ildasm.exewynikowy plik tekstowy IL można edytować ręcznie, aby dodać brakujące atrybuty. Następnie możesz uruchomić ten plik tekstowy za pośrednictwem Ilasm.exe , aby utworzyć końcowy plik wykonywalny.

Tej techniki można również użyć, aby utworzyć pojedynczy plik PE z kilku plików PE, oryginalnie utworzonych przez różne kompilatory.

Uwaga

Obecnie nie można używać tej techniki w połączeniu z plikami PE zawierającymi osadzony kod natywny (na przykład pliki PE generowane przez program Visual C++).

Aby to połączone użycie funkcji Ildasm.exe i Ilasm.exe było możliwie jak najdokładniejsze, asembler domyślnie nie zastępuje krótkich kodowań długimi kodami, które mogły być napisane w źródłach IL (lub które mogą być emitowane przez inny kompilator). Użyj opcji /optimize , aby wszędzie tam, gdzie to możliwe, zastąpić krótkie kodowanie.

Uwaga

Ildasm.exe działa tylko na plikach na dysku. Nie wykonuje operacji na plikach zainstalowanych w globalnej pamięci podręcznej zestawów.

Aby uzyskać więcej informacji na temat gramatyki języka IL, zobacz plik asmparse.grammar w Windows SDK.

Informacje o wersji

Począwszy od .NET Framework 4.5, można dołączyć atrybut niestandardowy do implementacji interfejsu przy użyciu kodu podobnego do następującego:

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

Począwszy od .NET Framework 4.5, można określić dowolny marshal blob (duży obiekt binarny) przy użyciu jego pierwotnej reprezentacji binarnej, jak pokazano w poniższym kodzie:

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

Aby uzyskać więcej informacji na temat gramatyki języka IL, zobacz plik asmparse.grammar w Windows SDK.

Przykłady

Następujące polecenie składa plik IL myTestFile.il i tworzy plik wykonywalnymyTestFile.exe.

ilasm myTestFile

Następujące polecenie składa plik IL myTestFile.il i tworzy .dll pliku myTestFile.dll.

ilasm myTestFile /dll

Następujące polecenie składa plik IL myTestFile.il i tworzy .dll pliku myNewTestFile.dll.

ilasm myTestFile /dll /output:myNewTestFile.dll

Poniższy przykład kodu przedstawia niezwykle prostą aplikację, która wyświetla w konsoli Hello world "Hello world!". Możesz skompilować ten kod, a następnie użyć Ildasm.exe do wygenerowania pliku IL.

using System;

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

Poniższy przykład kodu w języku IL odpowiada poprzedniemu przykładowi kodu w języku C#. Ten kod można skompilować do zestawu przy użyciu narzędzia ASEE. W przykładach kodu IL i C# wyświetlany jest komunikat "Hello world!" w konsoli.

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

Zobacz też