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 #include elementu . |
/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 stackSize wartość . |
/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