Udostępnij za pośrednictwem


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 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 wiersza polecenia dla deweloperów programu Visual Studio lub programu Visual Studio Developer PowerShell.

W wierszu polecenia wpisz:

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. W celu utworzenia pojedynczego pliku PE z Ilasm.exe można podać wiele argumentów pliku źródłowego. Uwaga: Upewnij się, że ostatni wiersz kodu w pliku źródłowym il ma znak końcowy biały lub znak końca wiersza.
Opcja Opis
/32bitpreferred Tworzy obraz 32-bitowy (PE32).
/wyrównanie: integer Ustawia wartość FileAlignment na wartość określoną w integer nagłówku NT Optional. 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 aplikacji systemu Windows jako dane wyjściowe.
/ramię Określa procesor Advanced RISC Machine (ARM) jako procesor docelowy.

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

Łączny przebieg: łączny czas spędzony na wykonywaniu wszystkich kolejnych operacji.

Uruchamianie: ładowanie i otwieranie pliku.

Emitowanie md: emitowanie metadanych.

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

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

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

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

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

Opt umożliwia optymalizację trybu 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.
/Flagi: integer Ustawia parametr ImageFlags na wartość określoną przez integer w 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 dla liczby całkowitej.
/fałda 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).
/zawierać: includePath Ustawia ścieżkę do wyszukiwania plików dołączonych do #includeelementu .
/itanium Określa procesor Intel Itanium jako procesor docelowy.

Jeśli nie określono bitowości obrazu, wartość domyślna to /pe64.
/klucz: keyFile Kompiluje filename z silnym podpisem przy użyciu klucza prywatnego zawartego w pliku keyFile.
/klucz: @keySource Kompiluje filename się przy użyciu silnego podpisu przy użyciu klucza prywatnego utworzonego w pliku keySource.
/Aukcji 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 major i minor są liczbami całkowitymi.
/noautoinherit Wyłącza dziedziczenie domyślne, Object gdy nie określono żadnej klasy bazowej.
/nocorstub Powoduje pominięcie generowania procedury wejścia CORExeMain.
/nologo Pomija wyświetlanie transparentu startowego firmy Microsoft.
/wyjście: 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 /dll opcji. Jeśli nie określisz /dll, wynik będzie plikiem wykonywalnym o nazwie myfile.dll.
/optimize Optymalizuje długie instrukcje, co powoduje zamianę ich na krótkie. Na przykład br na 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.
/zasób: file.res Zawiera określony plik zasobu w formacie *.res w wynikowym pliku .exe lub .dll . Można określić tylko jeden plik res z opcją /resource .
/ssver: int.int Ustawia numer wersji podsystemu w opcjonalnym nagłówku NT. W przypadku /appcontainer i /arm minimalny numer wersji to 6.02.
/stos: stackSize Ustawia wartość SizeOfStackReserve w nagłówku NT Optional na stackSizewartość .
/stripreloc Określa, że nie są potrzebne relokacje podstawowe.
/Podsystemu: integer Ustawia podsystem na wartość określoną przez integer w nagłówku opcjonalnym NT. Jeśli dyrektywa języka IL .subsystem została określona w pliku, to polecenie zastępuje ją. Aby uzyskać listę prawidłowych wartości dla elementu integer, zobacz winnt.h, IMAGE_SUBSYSTEM .
/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 opcje dla Ilasm.exe są bez uwzględniania wielkości 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 /output=file.ext.

Uwagi

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

Podobnie jak w przypadku innych kompilatorów przeznaczonych dla środowiska uruchomieniowego, takich jak C# i Visual Basic, Ilasm.exe nie tworzy plików obiektów pośrednich i nie wymaga etapu łączenia w celu utworzenia 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żony w asemblera IL i skompilowany przy użyciu 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żna 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 do 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.exe wynikowy plik tekstowy IL można ręcznie edytować, aby dodać brakujące atrybuty. Następnie możesz uruchomić ten plik tekstowy za pośrednictwem Ilasm.exe w celu utworzenia końcowego pliku wykonywalnego.

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

W celu zapewnienia tego połączonego użycia Ildasm.exe i Ilasm.exe tak dokładne, jak to możliwe, asembler domyślnie nie zastępuje krótkich kodowań długich, które mogły być zapisywane w źródłach IL (lub które mogą być emitowane przez inny kompilator). Użyj /optimize opcji, aby zastąpić krótkie kodowania wszędzie tam, gdzie to możliwe.

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 zestawie WINDOWS SDK.

Informacje o wersji

Począwszy od programu .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 programu .NET Framework 4.5, można określić dowolny obiekt BLOB marshal (duży obiekt binarny) przy użyciu jego nieprzetworzonej 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 zestawie WINDOWS SDK.

Przykłady

Następujące polecenie tworzy myTestFile.il pliku IL i tworzy myTestFile.exe wykonywalny.

ilasm myTestFile

Następujące polecenie tworzy myTestFile.il pliku IL i tworzy myTestFile.dll pliku .dll.

ilasm myTestFile /dll

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

ilasm myTestFile /dll /output:myNewTestFile.dll

Poniższy przykład kodu przedstawia niezwykle prostą aplikację, która wyświetla komunikat "Hello World!" do konsoli. Możesz skompilować ten kod, a następnie użyć narzędzia 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 asemblera IL. W konsoli są wyświetlane przykłady kodu IL i C#.

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