Bagaimana saya bisa melihat MSIL / CIL yang dihasilkan oleh kompiler C #? Mengapa itu disebut majelis?

130

Saya baru mengenal pemrograman .NET C #. Saya mengikuti beberapa buku. Dikatakan bahwa alih-alih mengompilasinya langsung ke kode biner (kode asli). Kode tingkat tinggi dikonversi menjadi bahasa perantara (disebut MSIL alias CIL). Tetapi ketika saya kompilasi, saya mendapatkan file exe / Dll.

  1. Apakah MSIL / CIL ini terkandung dalam file exe / dll ini?
  2. Saya ingin melihat kode bahasa perantara itu. Hanya untuk merasakan keberadaannya. Bagaimana cara melihatnya?
  3. Mereka memanggil file exe / dll ini suatu assembly. Apakah mereka menggunakan "kata mewah" ini hanya untuk membedakannya dari file exe / dll yang berisi kode biner (kode asli)?
starblue
sumber

Jawaban:

95
  1. Ya itu, lebih tepatnya di .textbagian file PE (portable executable = * .exe atau * .dll). Informasi lebih lanjut dapat ditemukan di sini .
  2. Pilihan terbaik adalah menggunakan ILSpy (Reflector tidak lagi gratis). Ini adalah disassembler gratis yang dapat membongkar perakitan Anda ke dalam MSIL tetapi juga C #, VB (sampai batas tertentu). .NET Framework SDK berisi ILDasm, yang merupakan dissasembler MSIL resmi.
  3. Pada dasarnya ya. Perakitan adalah file yang berisi kode MSIL dan metadata yang sesuai. Ini tidak terbatas pada file PE saja, tetapi semua implementasi CLR saat ini menggunakannya.

Jika saya dapat merekomendasikan buku yang bagus tentang masalah itu juga, itu Expert .NET 2.0 IL Assembler oleh Serge Lidin. Dia orang yang mendesain MSIL.

Johannes Rudolph
sumber
Tunggu! Itu tidak terletak di .textsextion? Jika tidak, apa .textisinya? dan ada apa dengan bagian #saya pikir dinamai dimulai dengan .. Jadi tidak mungkin.strings
Saya ingin tahu, mengapa ILDasm tidak direkomendasikan? Apakah hanya disertakan dengan (beberapa versi?) Visual Studio?
Sinjai
2
Keduanya memiliki tempat masing-masing, tetapi untuk sebagian besar (> 99,99%) pengguna ILSpy adalah pilihan yang tepat. Kemampuannya untuk mendekompilasi kode IL kembali ke C # ist sangat berharga untuk navigasi cepat dan majelis rekayasa balik. Jika Anda melakukan apa pun yang memancarkan IL mentah (mis. Anda sedang menulis kompiler atau menulis ulang perakitan IL, mis. Dengan Mono.Cecil) maka ILDasm sangat berguna karena dapat menunjukkan kepada Anda struktur mentah IL, token tables dll. Lagi , sebagian besar pakar non-IL akan bingung oleh mereka, jadi ILSpy mungkin adalah semua yang Anda inginkan dan butuhkan.
Johannes Rudolph
3
Wow, respons cepat 7 tahun kemudian! Saya belum banyak mengotak-atik IL, atau membandingkan semua opsi (itulah sebabnya saya bertanya sejak awal), tetapi apakah LINQPad tidak memiliki fitur penguraian ini?
Sinjai
Saya menginstalnya di VS 2017, tidak ada yang terjadi ketika saya mengklik melihat kode di ILSPY.
Anirudha Gupta
46

Salah satu cara favorit saya untuk melihat IL untuk cuplikan C # adalah dengan menggunakan alat LINQPad gratis . Setelah memasukkan beberapa kode dan memilih "Pernyataan C #" di bagian atas (atau "Program C #", mana yang cocok), klik tombol "IL" di bawah area entri kode, dan Anda akan melihat IL yang dihasilkan.

Menggunakan LINQPad untuk ini jauh lebih nyaman daripada memuat Visual Studio atau menjalankan kompiler dari baris perintah, kemudian memuat ILDASM dan membuka file .il dengan editor teks.

Mark Rushakoff
sumber
Alat bagus lainnya adalah tambahan Snippy
Thomas Levesque
Yang bagus! Saya memilih tetapi sedikit lebih rumit jika Anda harus memasukkan kelas khusus. Tetap saja, saya sangat suka yang ini!
Andrew Steitz
28

Jika Anda menginginkannya online, .NET Fiddle sangat bagus. Cukup tempel kode Anda dan klik View ILopsi di kanan atas.

nawfal
sumber
2
Tampaknya rusak sekarang.
Luke Maurer
@nawfal pecah di sini juga. Saya dulu menggunakannya.
aloisdg pindah ke codidact.com
Namun ada solusi online lain: sharplab.io . Periksa jawaban ini untuk informasi lebih lanjut: stackoverflow.com/a/51457583/1248177
aloisdg pindah ke codidact.com
Tidak yakin apa masalahnya, berfungsi dengan baik untuk saya .. @ aloisdgmovingtocodidact.com. Yang mengatakan sharplab.io terlihat licin, terima kasih telah menunjukkan :)
nawfal
16

Pilihan lain: Gunakan ReSharper

masukkan deskripsi gambar di sini Sumber / IL disinkronkan tampilan: garis latar belakang biru kiri sesuai dengan Blok IL kanan

Dalam Visual Studio:

  • Pilih ReSharper | Windows | Penampil IL
  • atau Menu Konteks: Navigasi | Kode IL

Mendukung tampilan yang disinkronkan dari Kode Sumber dan IL - ketika Anda mengklik pernyataan dalam sumber, blok yang sesuai dalam IL disorot (dan sebaliknya). Menampilkan deskripsi untuk IL dari Jaringan Pengembang Microsoft dan "set instruksi Bahasa Intermediate (CIL)" dari spesifikasi standar ECMA.

lihat Melihat Bahasa Intermediate (IL) di Bantuan Resharper. Gambar di atas adalah dari Bantuan Resharper.

Opsi gratis adalah menggunakan Jetbrains dotPeek

lihat juga: "Menjelajahi Bahasa Antara (IL) dengan ReSharper dan dotPeek", oleh Maarten Balliauw, 19 Januari 2017 - Jetbrains Blog

Michael Brux
sumber
Jawaban Anda salah memilih. Sunting sehingga saya dapat
membatalkan
Penampil IL di ReSharper luar biasa. Jika Anda mengarahkan mouse ke sintaks IL, itu menunjukkan tooltips yang lebih deskriptif yang menjelaskan apa yang dilakukan setiap kata kunci. Sangat cocok untuk orang yang baru mengenal IL!
InvalidBrainException
12
  1. Ya itu sedang berkumpul.
  2. Anda memerlukan .NET Reflector atau ILDasm .
  3. Rincian lebih lanjut tentang pemeriksaan perakitan DI SINI .

PS Ketika Anda mengikuti beberapa buku, saya akan sangat menyarankan Anda CLR melalui C # .

Penyamaran
sumber
11

Saya percaya bahwa mereka disebut "majelis" karena majelis adalah seperangkat modul, dirangkai bersama oleh manifes.

perakitan multi-file
(sumber: microsoft.com )

Lihat Isi Perakitan untuk detail.

John Saunders
sumber
9

Sharplab sharplab adalah alat online, bagus untuk kasus penggunaan sederhana. Ketikkan kode Anda di sebelah kiri, IL muncul di sebelah kanan.

Colin
sumber
Alat terbaik yang pernah diberi +1
Emad
7

Dalam banyak hal, .NET assemblies mirip dengan paket bytecode Java.

  1. Iya. Mereka juga mengandung manifes dan data lainnya, tetapi CIL adalah bagian dari exe / dll.
  2. Gunakan ILDasm atau Reflector - kebanyakan orang akan mengatakan Reflector, karena jauh lebih kuat. Keduanya akan menunjukkan kepada Anda apa yang dihasilkan CIL. Wikipedia memiliki daftar semua instruksi CIL , untuk perasaan yang lebih baik (seperti perakitan).
  3. Saya kira itu dimaksudkan sebagai kumpulan kode. Cara yang baik untuk membedakannya dari yang asli.
Oded
sumber
7

Saya baru saja menghabiskan beberapa jam mencari alat terbaik yang dapat membuat saya melihat kode IL langsung di dalam Visual Studio.

Satu-satunya solusi yang saya temukan sejauh ini adalah Msiler https://visualstudiogallery.msdn.microsoft.com/60fc53d4-e414-461b-a27c-3d5d2a53f637

itu bekerja dengan sangat baik!

Kalau tidak, solusi terbaik kedua, tetapi tanpa integrasi studio visual, adalah JetBrains dotPeek, yang cukup mengagumkan untuk jujur.

sebas
sumber
5

Saya tahu ini adalah pertanyaan lama, dan saya lebih suka alat apa pun di atas. Namun, dalam keadaan darurat, telah ada penampil MSIL dalam kotak dengan Visual Studio sejak setidaknya Versi 2005.

Alat ini dinamai ildasm.exe, dan terletak di folder berikut setelah instalasi Visual Studio default:

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"

Untuk informasi lebih lanjut, lihat: " Cara: Lihat Konten Majelis " di Perpustakaan MSDN.

bopapa_1979
sumber
2

Dari pengalaman saya, sumber terbaik pengetahuan terkait IL adalah Andrew Troelsen “Pro C # dan .NET Platform”. Mulai dari edisi ke-3 ia memiliki bab yang sangat, sangat luar biasa (sekitar 50 halaman) tentang cara memahami IL dan bahkan menulis kode Anda sendiri dan menggunakan ILAsm. Saya telah menggunakan informasi itu untuk menyelidiki apakah ada beberapa warisan di dunia .NET. Anda juga dapat mencoba menggunakan beberapa fitur yang sangat menarik di IL (mis. Pemfilteran pengecualian yang hanya ada di VB tetapi tidak dalam C #).

Saya sangat merekomendasikan untuk membaca bab itu.

Akhirnya, .NET Reflector adalah standar perusahaan untuk menginvestigasi kode IL rakitan dan buku Richter jelas-jelas "harus dibaca". Tetapi dari buku-buku lain seperti yang disebutkan di atas Anda dapat mengungkapkan hal-hal yang sangat berguna :)

Ya, setiap perakitan di dunia .NET memegang beberapa kode IL (bersama dengan manifes) yang dapat dilihat melalui Reflektor atau ILDasm. Terlebih lagi, Reflector dapat menunjukkan kepada Anda kode yang dioptimalkan C # dan VB. Ini berarti bahwa setiap orang dapat melihat kode sumber suatu rakitan dan itulah sebabnya dalam produk komersial obfuscator digunakan.

xenn_33
sumber
2

Jika Anda ingin melihat bahasa perantara, Coba unduh JustDecompile dari Telerik (Yang saat ini gratis, memerlukan pendaftaran terlebih dahulu).

Seret DLL Anda dan pilih ILdari kotak drop down di bagian atas!

Luke
sumber