Jak mogę wyświetlić MSIL / CIL wygenerowane przez kompilator C #? Dlaczego nazywa się to montażem?

134

Jestem nowy w programowaniu .NET C #. Śledzę kilka książek. Mówi się, że zamiast kompilować go bezpośrednio do kodu binarnego (kod natywny). Kod wysokiego poziomu jest konwertowany na język średniozaawansowany (zwany MSIL aka CIL). Ale kiedy kompiluję, otrzymuję plik exe / dll.

  1. Czy ten plik MSIL / CIL jest zawarty w tych plikach exe / dll?
  2. Chcę zobaczyć ten kod języka pośredniego. Tylko po to, żeby poczuć jego istnienie. Jak to zobaczyć?
  3. Nazywają ten plik exe / dll rozszerzeniem assembly. Czy używają tego „fantazyjnego słowa” tylko po to, aby odróżnić je od plików exe / dll, które zawierają kod binarny (kod natywny)?
starblue
źródło

Odpowiedzi:

98
  1. Tak, a dokładniej w .textsekcji pliku PE (przenośny plik wykonywalny = * .exe lub * .dll). Więcej informacji można znaleźć tutaj .
  2. Najlepszym wyborem jest użycie ILSpy (Reflector nie jest już darmowy). Jest to darmowy deasembler, który może rozłożyć twój zespół na MSIL, ale także C #, VB (do pewnego stopnia). .NET Framework SDK zawiera ILDasm, który jest oficjalnym programem dezasemblera MSIL.
  3. Zasadniczo tak. Zestaw to plik zawierający kod MSIL i odpowiadające mu metadane. Nie jest to ograniczone do plików PE jako takich, ale wszystkie obecne implementacje CLR ich używają.

Jeśli mogę polecić dobrą książkę na ten temat, to jest to Expert .NET 2.0 IL Assembler autorstwa Serge'a Lidina. To facet, który zaprojektował MSIL.

Johannes Rudolph
źródło
Czekać! Nie znajduje się w .textseksie? Jeśli nie, co .textzawiera? i co słychać w #myślach, że sekcje zaczynają się od .. Więc nie mogło być.strings
Jestem ciekawy, dlaczego ILDasm nie jest polecany? Czy jest dołączony tylko do (niektórych wersji?) Programu Visual Studio?
Sinjai
2
Oba mają swoje miejsca, ale dla większości (> 99,99%) użytkowników ILSpy jest właściwym wyborem. Zdolność do dekompilowania kodu IL z powrotem do C # jest nieoceniona w przypadku szybkiego nawigowania i inżynierii wstecznej w zestawach. Jeśli robisz cokolwiek, co emituje surowy IL (np. Piszesz kompilator lub przepisujesz asemblerowy IL, np. Z Mono.Cecil), wtedy ILDasm jest przydatny, ponieważ może pokazać surową strukturę IL, tabele tokenów itp. Znowu , większość ekspertów spoza systemów informatycznych będzie zdezorientowana, więc ILSpy jest prawdopodobnie wszystkim, czego chcesz i potrzebujesz.
Johannes Rudolph
3
Wow, szybka odpowiedź 7 lat później! Nie bawiłem się zbytnio z IL, ani nie porównałem wszystkich opcji (dlatego w pierwszej kolejności pytam), ale czy LINQPad nie ma tej funkcji dekompilacji?
Sinjai
Zainstalowałem go w VS 2017, nic się nie dzieje, gdy kliknę, aby zobaczyć kod w ILSPY.
Anirudha Gupta
46

Jednym z moich ulubionych sposobów wyświetlania IL dla fragmentu C # jest użycie bezpłatnego narzędzia LINQPad . Po wprowadzeniu kodu i wybraniu „instrukcji C #” u góry (lub „Programu C #”, w zależności od tego, który pasuje), kliknij przycisk „IL” pod obszarem wprowadzania kodu, a zobaczysz wygenerowany IL.

Używanie LINQPad do tego jest znacznie wygodniejsze niż ładowanie programu Visual Studio lub uruchamianie kompilatora z wiersza polecenia, a następnie ładowanie ILDASM i otwieranie pliku .il za pomocą edytora tekstu.

Mark Rushakoff
źródło
Innym dobrym narzędziem jest oschły dodatek dla Odbłyśnik: jasonhaley.com/blog/post/2008/11/23/ReflectorSnippy-Addin.aspx
Thomas Levesque
Niezłe! Głosowałem w górę, ale jest to nieco bardziej skomplikowane, jeśli musisz uwzględnić jakieś niestandardowe klasy. Mimo to bardzo mi się podoba!
Andrew Steitz
28

Jeśli chcesz mieć to w Internecie, .NET Fiddle jest doskonałe. Po prostu wklej swój kod i kliknij View ILopcję w prawym górnym rogu.

nawfal
źródło
3
Teraz wydaje się być zepsuty.
Luke Maurer
@nawfal też się zepsuł. Kiedyś go używałem.
aloisdg przenosi się na codidact.com
Jest jednak inne rozwiązanie online: sharplab.io . Sprawdź tę odpowiedź, aby uzyskać więcej informacji: stackoverflow.com/a/51457583/1248177
aloisdg przenosi się na codidact.com
Nie wiem, na czym polega problem, dla mnie działa dobrze .. @ aloisdgmovingtocodidact.com. Powiedział, że sharplab.io wygląda zgrabnie, dzięki za wskazanie :)
nawfal
16

Inna opcja: użyj ReSharper

wprowadź opis obrazu tutaj Widok zsynchronizowany ze źródłem / IL: lewa niebieska linia tła odpowiada prawemu blokowi IL

W programie Visual Studio:

  • Wybierz ReSharper | Windows | Przeglądarka IL
  • lub Menu kontekstowe: Nawigacja | Kod IL

Obsługuje zsynchronizowany widok kodu źródłowego i IL - po kliknięciu instrukcji w źródle odpowiedni blok w języku IL jest podświetlany (i odwrotnie). Wyświetla opisy dla języka IL z Microsoft Developer Network i „Zestaw instrukcji wspólnego języka pośredniego (CIL)” ze standardowej specyfikacji ECMA.

zobacz Wyświetlanie języka pośredniego (IL) w pomocy Resharper. Zdjęcie powyżej pochodzi od Resharper Help.

Bezpłatną opcją jest użycie Jetbrains dotPeek

zobacz także: „Exploring Intermediate Language (IL) with ReSharper and dotPeek”, Maarten Balliauw, 19 stycznia 2017 - Jetbrains Blog

Michael Brux
źródło
Pomyłkowo zignorował Twoją odpowiedź. Edytuj go tak, żebym mógł zagłosować za głosem
Rudresha Parameshappa
Przeglądarka IL w ReSharper jest świetna. Jeśli najedziesz kursorem myszy na składnię IL, wyświetli się raczej opisowe podpowiedzi wyjaśniające, co robi każde słowo kluczowe. Świetne dla osób, które są nowicjuszami w IL!
InvalidBrainException
11

Uważam, że są one nazywane „zestawami”, ponieważ zestaw to zestaw modułów połączonych razem przez manifest.

montaż wielu plików
(źródło: microsoft.com )

Aby uzyskać szczegółowe informacje, patrz Zawartość zestawu.

John Saunders
źródło
9

Sharplab sharplab to narzędzie online, idealne do prostych przypadków użycia. Wpisz swój kod po lewej stronie, po prawej pojawi się IL.

Colin
źródło
Najlepsze narzędzie w historii +1
Emad
7

Pod wieloma względami zestawy .NET są podobne do pakietów kodu bajtowego Java.

  1. Tak. Zawierają również manifesty i inne dane, ale CIL jest częścią exe / dll.
  2. Użyj ILDasm lub Reflector - większość ludzi powiedziałaby, że Reflector, ponieważ jest znacznie mocniejszy. Oba pokażą Ci, co zostało wyprodukowane przez CIL. Wikipedia ma listę wszystkich instrukcji CIL , dla lepszego wrażenia (przypomina montaż).
  3. Myślę, że ma to być zbiór kodu. Dobry sposób na odróżnienie go od rodzimego.
Oded
źródło
7

Właśnie spędziłem kilka godzin na poszukiwaniu najlepszego narzędzia, które pozwoliłoby mi przeglądać kod IL bezpośrednio w programie Visual Studio.

Jedynym rozwiązaniem, które do tej pory znalazłem, jest Msiler https://visualstudiogallery.msdn.microsoft.com/60fc53d4-e414-461b-a27c-3d5d2a53f637

działa całkiem dobrze!

Poza tym drugim najlepszym rozwiązaniem, ale bez integracji ze studiem wizualnym, jest JetBrains dotPeek, co jest całkiem niesamowite, szczerze mówiąc.

sebas
źródło
5

Wiem, że to stare pytanie i wolałbym dowolne z powyższych narzędzi. Jednak w skrócie, w pudełku z Visual Studio była przeglądarka MSIL od co najmniej wersji 2005.

Narzędzie nosi nazwę ildasm.exei znajduje się w następujących folderach po domyślnych instalacjach programu Visual Studio:

Visual Studio 2005 ”C:\Program Files (x86)\Microsoft Visual Studio 8\SDK\v2.0\Bin\ildasm.exe"

Visual Studio 2008 „ C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\ildasm.exe

Visual Studio 2010 „ C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\ildasm.exe

Aby uzyskać więcej informacji, zobacz: „ How to: View Assembly Contents ” w bibliotece MSDN.

bopapa_1979
źródło
2

Z mojego doświadczenia wynika, że ​​najlepszym źródłem wiedzy związanej z IL jest Andrew Troelsen „Pro C # and .NET Platform”. Począwszy od 3. wydania ma naprawdę, naprawdę wyjątkowy rozdział (około 50 stron) o tym, jak rozumieć IL, a nawet pisać własny kod i używać ILAsm. Wykorzystałem te informacje do zbadania, czy w świecie .NET istnieje wielokrotne dziedziczenie. Możesz także spróbować zastosować kilka bardzo interesujących funkcji w IL (np. Filtrowanie wyjątków, które istnieją tylko w VB, ale nie w C #).

Gorąco polecam przeczytanie tego rozdziału.

Ostatecznie .NET Reflector jest standardem korporacyjnym do badania kodu IL złożeń, a książka Richtera jest zdecydowanie „obowiązkowa”. Ale z innych książek, takich jak wspomniane powyżej, możesz ujawnić naprawdę przydatne rzeczy :)

Tak, każdy zestaw w świecie .NET zawiera kod IL (wraz z manifestem), który może być przeglądany przez Reflector lub ILDasm. Co więcej, Reflector może pokazać Ci kod zoptymalizowany pod kątem C # i VB. Oznacza to, że każda osoba może zobaczyć kod źródłowy zestawu i dlatego w produktach komercyjnych stosuje się zaciemniacze.

xenn_33
źródło
2

Chcę zobaczyć język pośredni, Spróbuj pobrać JustDecompile z Telerik (który jest obecnie bezpłatny, wymaga jednak rejestracji).

Przeciągnij bibliotekę DLL i wybierz ją ILz listy rozwijanej u góry!

Łukasz
źródło