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 Proces wykonywania zarządzanego). Możesz uruchomić wynikowy plik wykonywalny zawierający 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 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 podać wiele argumentów pliku źródłowego w celu utworzenia pojedynczego pliku PE z Ilasm.exe. 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 parametr FileAlignment na wartość określoną przez integer w 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.
/Podstawowej:integer Ustawia wartość ImageBase 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.

Pisanie 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ę 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ą. Aby uzyskać listę prawidłowych wartości dla liczby całkowitej, zobacz CorHdr.h, COMIMAGE_FLAGS.
/Złożyć 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. (Ustawienie domyślne dla /appcontainer).
/Obejmują:includePath Ustawia ścieżkę do wyszukiwania plików dołączonych do elementu #include.
/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 keyFilepliku .
/Klucz: @keySource Kompiluje filename z silnym podpisem przy użyciu klucza prywatnego utworzonego w lokalizacji 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 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.
/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 opcję /dll , domyślne rozszerzenie to .dll. Uwaga: Określanie /output:myfile.dll nie ustawia opcji /dll . Jeśli nie określisz /dll, wynik będzie plikiem wykonywalnym o nazwie myfile.dll.
/Optymalizacji Optymalizuje długie instrukcje, co powoduje zamianę ich na krótkie. Na przykład do br.s. br
/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.
/Ciche Określa tryb cichy; nie zgłasza postępów zestawu.
/Zasobów:file.res Zawiera określony plik zasobów 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.
/Stosu: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 NT Optional. 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 dlaIlasm.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. Za pomocą Ilasm.exedeweloperzy 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 generuje 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 asemblerze 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.exewynikowy 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++).

Aby to połączyć korzystanie z Ildasm.exe i Ilasm.exe jak najdokładniejsze, domyślnie asembler 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 opcji /optimize , 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 wersji .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 marshaling obiektów BLOB (binarny duży obiekt) 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 plik IL myTestFile.il i tworzy plik wykonywalny myTestFile.exe.

ilasm myTestFile

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

ilasm myTestFile /dll

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

ilasm myTestFile /dll /output:myNewTestFile.dll

Poniższy przykład kodu przedstawia niezwykle prostą aplikację, która wyświetla w konsoli komunikat "Hello world!". 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# "Hello world!".

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