Ildasm.exe (Dezasembler IL)
Dezasembler IL jest narzędziem towarzyszącym asemblerowi IL (Ilasm.exe). Ildasm.exe pobiera przenośny plik wykonywalny (PE), który zawiera kod języka pośredniego (IL) i tworzy plik tekstowy odpowiedni do Ilasm.exe.
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
ildasm [options] [PEfilename] [options]
Parametry
Dostępne są następujące opcje dla plików .exe, .dll, .obj, .lib i winmd .
Opcja | Opis |
---|---|
/out= filename |
Tworzy plik wyjściowy z określonym filename elementem , a nie wyświetla wyniki w graficznym interfejsie użytkownika. |
/Rtf | Generuje wyjście w formacie RTF. Nieprawidłowy z /text opcji. |
/Tekst | Wyświetla wyniki w oknie konsoli, a nie w graficznym interfejsie użytkownika czy plik wyjściowy. |
/html | Generuje wyjście w formacie HTML. Prawidłowy tylko z /output opcji. |
/? | Wyświetla składnię polecenia i opcje narzędzia. |
Dostępne są następujące dodatkowe opcje dla plików .exe, .dll i winmd .
Opcja | Opis |
---|---|
/Bajtów | Pokazuje rzeczywiste bajty w formacie szesnastkowym, jak mówi instrukcja. |
/caverbal | Generuje obiekty typu blob niestandardowych atrybutów w formie słownej. Domyślnie jest to forma binarna. |
/linenum | Dołącza odwołania do oryginalnych wierszy źródłowych. |
/nobar | Pomija wyskakujące okienko ze wskaźnikiem postępu dezasemblera. |
/noca | Pomija wyjście niestandardowych atrybutów. |
/projekt | Wyświetla metadane w sposób, w jaki jest wyświetlany kod zarządzany, zamiast sposobu wyświetlania go w natywnym środowisko wykonawcze systemu Windows. Jeśli PEfilename nie jest to plik metadanych systemu Windows (winmd), ta opcja nie ma wpływu. Zobacz Obsługa programu .NET Framework dla aplikacji ze Sklepu Windows i środowisko wykonawcze systemu Windows. |
/pubonly | Dezasembluje tylko typy publiczne i elementy członkowskie. Odpowiednik /visibility:PUB. |
/quoteallnames | Umieszcza wszystkie nazwy w pojedynczym cudzysłowie. |
/raweh | Wyświetla klauzule obsługi błędów w pierwotnej formie. |
/źródło | Wyświetla wiersze z oryginalnego źródła jako komentarze. |
/Tokeny | Wyświetla tokeny metadanych klas i składowych. |
/visibility: vis [+vis ...] |
Dezasembluje tylko typy lub elementy członkowskie o określonej widoczności. Poniżej przedstawiono prawidłowe wartości dla elementu vis :PUB — publiczny PRI — prywatne FAM — rodzina ASM — zestaw FAA — rodzina i zestaw FOA — rodzina lub zestaw PSC — zakres prywatny Aby uzyskać definicje tych modyfikatorów widoczności, zobacz MethodAttributes i TypeAttributes. |
Poniższe opcje są prawidłowe tylko w przypadku plików .exe, .dll i winmd dla plików wyjściowych pliku lub konsoli.
Opcja | Opis |
---|---|
/cały | Określa kombinację opcji /header, /bytes, /stats, /classlist i /tokens . |
/classlist | Dołącza listę klas zdefiniowanych w module. |
/naprzód | Używa deklaracji przekazującej klasy. |
/Nagłówki | Dołącza informacje nagłówka pliku do wyjścia. |
/item: class [:: member [(sig ]] |
W zależności od określonego argumentu dezasembluje następujące obiekty: - Dezasembluje określony class element .- Dezasembluje określony member element class .- Dezasembluje member element z class określonym podpisem sig . Format to sig :[ instance ] returnType (parameterType1 , parameterType2 , ..., parameterTypeN )Uwaga W programie .NET Framework w wersjach 1.0 i 1.1 sig należy wykonać nawias zamykający: (sig) . Począwszy od programu Net Framework 2.0 nawias zamykający musi zostać pominięty: (sig . |
/noil | Wyłącza wyjście kodu zestawu IL. |
/Statystyki | Zawiera dane statystyczne dotyczące obrazu. |
/typelist | Generuje pełną listę typów, aby zachować kolejność typów w rundzie. |
/Unicode | Używa kodowania Unicode danych wyjściowych. |
/utf8 | Używa kodowania UTF-8 danych wyjściowych. Domyślne jest ANSI. |
Poniższe opcje są prawidłowe tylko dla plików wyjściowych plików .exe, .dll, .obj, .lib i winmd .
Opcja | Opis |
---|---|
/metadata[=specifier ] |
Pokazuje metadane, gdzie specifier to:MDHEADER — pokaż informacje i rozmiary nagłówka metadanych. HEX — wyświetla informacje w szesnastkowym, a także w słowach. CSV — pokaż liczby rekordów i rozmiary sterty. UNREX — pokaż nierozwiązane zewnętrzne. SCHEMA — pokaż informacje o nagłówku metadanych i schemacie. RAW — pokaż nieprzetworzone tabele metadanych. HEAPS — pokaż surowe stertki. VALIDATE — zweryfikuj spójność metadanych. Można określić /metadata wiele razy, z różnymi wartościami dla specifier . |
Następujące opcje są prawidłowe tylko dla plików lib dla plików plików lub danych wyjściowych konsoli.
Opcja | Opis |
---|---|
/objectfile=filename |
Wyświetla metadane pojedynczego pliku obiektu w określonej bibliotece. |
Uwaga
Wszystkie opcje dla Ildasm.exe są bez uwzględniania wielkości liter i rozpoznawane przez pierwsze trzy litery. Na przykład /quo jest równoważne /quoteallnames. Opcje, które określają argumenty, akceptują dwukropek (:) lub znak równości (=) jako separator między opcją a argumentem. Na przykład /output: nazwa pliku jest równoważna /output= nazwa pliku.
Uwagi
Ildasm.exe działa tylko na plikach PE na dysku. Nie wykonuje operacji na plikach zainstalowanych w globalnej pamięci podręcznej zestawów.
Plik tekstowy utworzony przez Ildasm.exe może służyć jako dane wejściowe do asemblera IL (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 jego 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żna przetworzyć ten plik tekstowym Asemblerem IL, aby wygenerować ostateczny plik wykonywalny.
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++).
Można użyć domyślnego graficznego interfejsu użytkownika dezasemblera IL, aby wyświetlić metadane i zdezasemblowany kod jakiegokolwiek istniejącego pliku PE w hierarchicznym widoku drzewa. Aby użyć graficznego interfejsu użytkownika, wpisz ildasm w wierszu polecenia bez podawania argumentu PEfilename lub żadnych opcji. W menu Plik możesz przejść do pliku PE, który chcesz załadować do Ildasm.exe. Aby zapisać metadane i zdezasemblowany kod wyświetlany dla wybranego pe, wybierz polecenie Zrzut w menu Plik . Aby zapisać tylko widok drzewa hierarchicznego, wybierz polecenie Dump Treeview z menu Plik . Aby uzyskać szczegółowy przewodnik dotyczący ładowania pliku do Ildasm.exe i interpretowania danych wyjściowych, zobacz samouczek Ildasm.exe znajdujący się w folderze Samples dostarczanym z zestawem Windows SDK.
Jeśli podasz Ildasm.exe z argumentem PEfilename zawierającym zasoby osadzone, narzędzie generuje wiele plików wyjściowych: plik tekstowy zawierający kod IL i, dla każdego osadzonego zasobu zarządzanego, plik resources utworzony przy użyciu nazwy zasobu z metadanych. Jeśli zasób niezarządzany jest osadzony w PEfilename, plik res jest generowany przy użyciu nazwy pliku określonego dla danych wyjściowych IL przez /output opcji.
Uwaga
Ildasm.exe zawiera tylko opisy metadanych dla plików wejściowych .obj i .lib. Kod IL dla tych typów plików nie jest dezasemblowany.
Możesz uruchomić Ildasm.exe za pośrednictwem an.exe lub pliku .dll , aby określić, czy plik jest zarządzany. Jeśli plik nie jest zarządzany, narzędzie wyświetli komunikat informujący, że plik nie ma prawidłowego nagłówka środowiska uruchomieniowego języka wspólnego i nie może zostać zdezasemblowany. Jeśli plik jest zarządzany, narzędzie zostanie uruchomione pomyślnie.
Informacje o wersji
Począwszy od programu .NET Framework 4.5, Ildasm.exe obsługuje nierozpoznany marshaling blOB (binarny duży obiekt), wyświetlając nieprzetworzonej zawartości binarnej. Na przykład, poniższy kod przedstawia sposób wyświetlania skierowanego obiektu typu BLOB, wygenerowanego przez program C#.
public void Test([MarshalAs((short)70)] int test) { }
// IL from Ildasm.exe output
.method public hidebysig instance void Test(int32 marshal({ 46 }) test) cil managed
Począwszy od programu .NET Framework 4.5, Ildasm.exe wyświetla atrybuty stosowane do implementacji interfejsu, jak pokazano na poniższym fragcie z danych wyjściowych Ildasm.exe :
.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 )
…
Przykłady
Następujące polecenie powoduje, że metadane i zdezasemblowany kod pliku MyHello.exe
PE będą wyświetlane w domyślnym graficznym interfejsie użytkownika Ildasm.exe .
ildasm myHello.exe
Następujące polecenie dezasembluje plik MyFile.exe
i zapisuje wynikowy tekst asemblera IL w pliku MyFile.il.
ildasm MyFile.exe /output:MyFile.il
Następujące polecenie dezasembluje plik MyFile.exe
i wyświetla wynikowy tekst asemblera IL w oknie konsoli.
ildasm MyFile.exe /text
Jeśli plik MyApp.exe
zawiera osadzone zasoby zarządzane i niezarządzane, następujące polecenie generuje cztery pliki: MyApp.il, MyApp.res, Icons.resources i Message.resources:
ildasm MyApp.exe /output:MyApp.il
Następujące polecenie dezasembluje metodę MyMethod
w klasie MyClass
w pliku MyFile.exe
i wyświetla dane wyjściowe w oknie konsoli.
ildasm /item:MyClass::MyMethod MyFile.exe /text
W poprzednim przykładzie może istnieć kilka metod o nazwie MyMethod
z różnymi podpisami. Następujące polecenie dezasembluje metodę MyMethod
wystąpienia za pomocą zwracanego typu void oraz typów parametrów int32 i ciągów.
ildasm /item:"MyClass::MyMethod(instance void(int32,string)" MyFile.exe /text
Uwaga
W programie .NET Framework w wersji 1.0 i 1.1 lewy nawias zgodny z nazwą metody musi być wyważony przez prawy nawias po podpisie: MyMethod(instance void(int32))
. Począwszy od programu .NET Framework 2.0 nawias zamykający musi zostać pominięty: MyMethod(instance void(int32)
.
Aby pobrać metodę static
(Shared
metoda w Visual Basic), pomiń słowo kluczowe instance
. Typy klas, które nie są typami pierwotnymi, takie jak int32
i string
muszą zawierać przestrzeń nazw i muszą być poprzedzone słowem kluczowym class
. Typy zewnętrzne muszą być poprzedzone nazwą biblioteki umieszczoną w nawiasach kwadratowych. Następujące polecenie dezasembluje statyczną metodę o nazwie MyMethod
, która ma jeden parametr typu AppDomain i ma zwracany typ AppDomain.
ildasm /item:"MyClass::MyMethod(class [mscorlib]System.AppDomain(class [mscorlib]System.AppDomain)" MyFile.exe /text
Typ zagnieżdżony musi być poprzedzony klasą zawierającą i oddzielony od niej ukośnikiem. Jeśli na przykład MyNamespace.MyClass
klasa zawiera klasę zagnieżdżona o nazwie NestedClass
, zagnieżdżona klasa jest identyfikowana w następujący sposób: class MyNamespace.MyClass/NestedClass
.