C # derleyicisi tarafından oluşturulan MSIL / CIL'i nasıl görüntüleyebilirim? Neden montaj deniyor?


130

.NET C # programlamada yeniyim. Birkaç kitabı takip ediyorum. Doğrudan ikili koda (Yerel kod) derlemek yerine söylenir. Yüksek seviyeli kod, ara dile dönüştürülür (MSIL veya CIL olarak adlandırılır). Ama derlediğimde bir exe / Dll dosyası alıyorum.

  1. Bu MSIL / CIL, bu exe / dll dosyasında yer alıyor mu?
  2. Bu ara dil kodunu görmek istiyorum. Sadece varlığını hissetmek için. Nasıl görüntülenir?
  3. Bu exe / dll dosyasını bir assembly. Bu "süslü kelimeyi" sadece ikili kod (yerel kod) içeren exe / dll dosyalarından ayırmak için mi kullanıyorlar?

Yanıtlar:


95
  1. Evet, daha doğrusu PE dosyasının.text bölümünde (taşınabilir yürütülebilir = * .exe veya * .dll). Daha fazla bilgiyi burada bulabilirsiniz .
  2. En iyi seçenek ILSpy kullanmaktır (Reflektör artık ücretsiz değil). Montajınızı MSIL'e ve ayrıca C #, VB'ye (bir dereceye kadar) ayırabilen ücretsiz bir demonte edicidir. .NET Framework SDK, resmi MSIL dağıtıcısı olan ILDasm'ı içerir.
  3. Temelde evet. Derleme, MSIL kodunu ve ilgili meta verileri içeren bir dosyadır. Bu, kendi başına PE dosyalarıyla sınırlı değildir, ancak mevcut tüm CLR uygulamaları bunları kullanır.

Bu konuda da iyi bir kitap tavsiye edebilirsem, Serge Lidin tarafından yazılan Expert .NET 2.0 IL Assembler. MSIL'i tasarlayan adam.


Bekle! .textSextion'da yer almıyor mu? Değilse, ne .textiçerir? ve neyin var #diye düşündüğüm bölümler ile başlayarak adlandırılır .. Olmaz mıydı.strings

Merak ediyorum, ILDasm neden tavsiye edilmiyor ? Yalnızca (? Bazı sürümleri?) Visual Studio'ya dahil mi?
Sinjai

2
Her ikisinin de kendi yerleri vardır, ancak çoğu (>% 99,99) kullanıcı için ILSpy doğru seçimdir. IL kodunu C # ist'e geri derleyebilme yeteneği, hızlı bir şekilde gezinme ve tersine mühendislik montajları için paha biçilmezdir. Ham IL yayan herhangi bir şey yapıyorsanız (örneğin, bir derleyici yazıyorsanız veya derlemeyi yeniden yazıyorsanız, örneğin Mono.Cecil ile) ILDasm işe yarar çünkü size IL'nin ham yapısını, belirteç tablolarını vb. Gösterebilir. ILSpy dışındaki uzmanların çoğu bu kişiler tarafından karıştırılacaktır, bu nedenle ILSpy muhtemelen tek istediğiniz ve ihtiyacınız olan şeydir.
Johannes Rudolph

3
Vay canına, 7 yıl sonra hızlı yanıt! IL ile çok fazla uğraşmadım veya tüm seçenekleri karşılaştırmadım (bu yüzden ilk etapta soruyorum), ancak LINQPad'in bu kod çözme özelliği yok mu?
Sinjai

VS 2017'de kurdum, ILSPY'deki kodu görmek için tıkladığımda hiçbir şey olmuyor.
Anirudha Gupta

46

Bir C # parçacığı için IL'yi görmenin en sevdiğim yollarından biri , ücretsiz LINQPad aracını kullanmaktır . Bir kod girdikten ve üstte "C # ifadeleri" ni (veya hangisi uygunsa "C # Programı" nı) seçtikten sonra, kod giriş alanının altındaki "IL" düğmesine tıklayın ve oluşturulan IL'yi göreceksiniz.

Bunun için LINQPad'i kullanmak, Visual Studio'yu yüklemekten veya derleyiciyi komut satırından çalıştırdıktan sonra ILDASM'yi yükleyip .il dosyasını bir metin düzenleyicisiyle açmaktan çok daha kullanışlıdır.


Bir başka iyi araç da Reflector için Snippy eklentisidir: jasonhaley.com/blog/post/2008/11/23/ReflectorSnippy-Addin.aspx
Thomas Levesque

Güzel bir! Yukarı oy verdim ancak herhangi bir özel sınıf eklemeniz gerekiyorsa biraz daha karmaşık. Yine de, bunu gerçekten seviyorum!
Andrew Steitz

28

Çevrimiçi olmasını istiyorsanız, .NET Fiddle mükemmeldir. Kodunuzu yapıştırın ve View ILsağ üstteki seçeneği tıklayın .


2
Şimdi kırılmış gibi görünüyor.
Luke Maurer

@ nawfal da burada kırıldı. Ben kullanırdım.
aloisdg codidact.com'a taşınıyor

Yine de başka bir çevrimiçi çözüm var: sharplab.io . Daha fazla bilgi için bu yanıtı kontrol edin: stackoverflow.com/a/51457583/1248177
aloisdg codidact.com'a taşınıyor

Sorunun ne olduğundan emin değilim, benim için iyi çalışıyor .. @ aloisdgmovingtocodidact.com. Bu, sharplab.io'nun düzgün göründüğünü söyledi, işaret
ettiğiniz

16

Başka bir seçenek: ReSharper kullanın

görüntü açıklamasını buraya girin Kaynak / IL senkronize görünüm: sol mavi arka plan çizgisi, sağ IL Bloğuna karşılık gelir

Visual Studio'da:

  • ReSharper'ı seçin | Windows | IL Görüntüleyici
  • veya Bağlam Menüsü: Gezin | IL Kodu

Kaynak Kodunun ve IL'nin senkronize görünümünü destekler - kaynaktaki bir ifadeye tıkladığınızda, IL'deki karşılık gelen blok vurgulanır (ve tersi). Microsoft Developer Network'ten IL için açıklamaları ve ECMA standart spesifikasyonundan "Common Intermediate Language (CIL) komut seti" açıklamalarını görüntüler.

Resharper Yardımı'nda Ara Dili (IL) Görüntüleme konusuna bakın . Yukarıdaki resim Resharper Help'ten alınmıştır.

Ücretsiz seçenek Jetbrains dotPeek kullanmaktır

ayrıca bkz: "ReSharper ve dotPeek ile Ara Dili (IL) Keşfetmek", Maarten Balliauw, 19 Ocak 2017 - Jetbrains Blog


Yanlışlıkla cevabınızı reddettiniz. Yukarı
oy

ReSharper'daki IL Viewer harika. IL sözdiziminin üzerine fareyi getirirseniz, her bir anahtar kelimenin ne yaptığını açıklayan oldukça açıklayıcı ipuçları gösterir. IL'de yeni olan insanlar için harika!
InvalidBrainException



9

Sharplab Sharplab , basit kullanım durumları için harika bir çevrimiçi araçtır. Sol tarafa kodunuzu yazın, sağda IL görünür.


Şimdiye kadarki en iyi araç +1
Emad

7

Pek çok açıdan .NET derlemeleri Java bayt kodu paketlerine benzer.

  1. Evet. Ayrıca bildirimler ve diğer verileri de içerirler, ancak CIL exe / dll'nin bir parçasıdır.
  2. ILDasm veya Reflector kullanın - çoğu insan çok daha güçlü olduğu için Reflector der. Her ikisi de size CIL'in üretildiğini gösterecektir. Daha iyi bir his için Wikipedia'da tüm CIL talimatlarının bir listesi vardır (montaj gibidir).
  3. Sanırım bir kod derlemesi olarak kastediliyor. Onu yerelden ayırmanın iyi bir yolu.


5

Bunun eski bir soru olduğunu biliyorum ve yukarıdaki araçlardan herhangi birini tercih ederim. Bununla birlikte, bir tutam, en az Sürüm 2005'ten beri Visual Studio ile birlikte kutuda bir MSIL görüntüleyici olmuştur.

Araç adlandırılır ildasm.exeve varsayılan Visual Studio yüklemelerinden sonra aşağıdaki klasörlerde bulunur:

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"

Daha fazla bilgi için, bkz . MSDN Kitaplığı'nda " Nasıl Yapılır: Derleme İçeriğini Görüntüleme ".


2

Deneyimlerime göre, IL ile ilgili en iyi bilgi kaynağı Andrew Troelsen “Pro C # ve .NET Platformu” dur. 3. baskıdan başlayarak, IL'yi nasıl anlayacağınıza ve hatta kendi kodunuzu nasıl yazacağınıza ve ILAsm kullanacağınıza dair gerçekten, gerçekten olağanüstü bir bölümü (yaklaşık 50 sayfa) var. Bu bilgileri .NET dünyasında çoklu kalıtımın var olup olmadığını araştırmak için kullandım. Ayrıca, IL'de bazı çok ilginç özellikleri kullanmayı deneyebilirsiniz (örneğin, yalnızca VB'de var olan ancak C #'da bulunmayan istisnaların filtrelenmesi).

Bu bölümü okumanızı şiddetle tavsiye ederim.

Sonunda, .NET Reflector derlemelerin IL kodunu araştırmak için kurumsal bir standarttır ve Richter'in kitabı kesinlikle "okunması gereken" şeylerdir. Ancak yukarıda bahsedildiği gibi diğer kitaplardan gerçekten yararlı şeyler ortaya çıkarabilirsiniz :)

Evet, .NET dünyasındaki her derleme, Reflektör veya ILDasm aracılığıyla görüntülenebilen bazı IL kodunu (manifesto ile birlikte) tutar. Dahası, Reflector size C # ve VB için optimize edilmiş kod gösterebilir. Bu, herhangi bir kişinin bir montajın kaynak kodunu görüntüleyebileceği anlamına gelir ve bu yüzden ticari ürünlerde gizleyiciler kullanılır.


2

Ara dili görüntülemek istiyorum, JustDecompile'ı Telerik'ten indirmeyi deneyin (Şu anda ücretsizdir, yine de kayıt gerektirir).

DLL dosyanıza sürükleyin ILve üstteki açılır kutudan seçim yapın !


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.