Mengapa Reflector merupakan utilitas yang sangat penting?


10

Membaca brouhaha seputar Reflector yang dibayar membuat saya berpikir tentang produk dan penggunaannya. Banyak orang tampaknya menganggapnya sebagai alat penting.

Harus saya akui, saya sudah bertahun-tahun tidak menggunakan Reflektor. Maksud saya, ada dokumentasi untuk .Net API dan komponen pihak ketiga yang saya gunakan. Di masa lalu, setiap kali seorang rekan kerja mengeluarkan Reflector dari sabuk alatnya, saya merasa dia menuju ke rumput liar.

Membaca semua gairah di sekitar Reflector membuat saya bertanya apakah saya benar-benar kehilangan sesuatu di sini. Mengapa Anda sering membutuhkan sesuatu seperti Reflektor sehingga Anda menganggapnya sebagai alat yang penting? Saya dapat melihatnya dibutuhkan pada kesempatan yang sangat jarang, tetapi tidak cukup untuk dianggap sebagai alat penting. Tolong beri tahu saya.


Saya senang mengatakan bahwa di zaman sekarang ini, Reflector tidak lagi menjadi utilitas yang sangat penting (kecuali Anda menggunakan versi .NET yang jauh lebih tua). Anda sekarang dapat mengunjungi Sumber Referensi .NET dan melihat cara kerja CLR, komentar lucu dan semua. Sebagai contoh, inilah metode StringBuilder. Panjang yang saya bicarakan dalam jawaban saya di bawah ini. Anda dapat melihat di baris 487 bagaimana menambahkan karakter nol, bukan spasi, jika Anda menetapkan panjang yang lebih besar.
Kyralessa

Jawaban:


8

Berikut adalah contoh sempurna dari jenis pertanyaan. NET Reflector dapat menjawab untuk Anda.

Atau Anda dapat mempostingnya di SO dan membiarkan orang lain yang memasang Reflector menjawabnya untuk Anda. ;)


Satu-satunya masalah saya dengan itu adalah bahwa itu tidak sah untuk menggunakannya seperti itu;)

@Pierre, bagaimana menurut Anda? Jika tidak ada yang lain, Anda dapat menggunakan referensi
source.microsoft.com/netframework.aspx

Kode reverse engineering tidak sah di sebagian besar negara maju. Dan tidak ada gunanya ketika sumber diterbitkan seperti di tautan Anda;)

2
@Pierre 303: Undang-undang hak cipta AFAIK sering kali memiliki pengecualian yang mengatakan bahwa rekayasa balik demi antarmuka dengan perangkat lunak yang digunakan secara hukum diizinkan. Contoh dalam jawaban ini adalah dari kategori itu.
sharptooth

@sharptooth: apakah Anda memiliki beberapa referensi tentang itu? Saya pernah berada dalam situasi seperti itu di masa lalu dan tidak dapat melanjutkan karena hukum. Saya akan sangat tertarik dengan itu.

5

Saya menggunakan reflektor secara teratur (mungkin rata-rata satu atau dua kali seminggu) untuk membantu dengan dua masalah yang berbeda.

  1. API / Perpustakaan yang didokumentasikan dengan buruk: Contoh favorit saya untuk ini adalah SharePoint. Kebanyakan setiap pengembang yang saya tahu melakukan pengembangan SharePoint menggunakannya untuk melengkapi dokumentasi yang tersedia. Bisakah kita bertahan tanpanya, sebagian besar ya; tetapi ada sejumlah kasus seandainya itu agak sulit.

  2. Melakukan debug kesalahan yang tidak jelas: Hal ini juga dapat berguna dalam mencari tahu mengapa ada sesuatu yang melempar pengecualian. Jika Anda dapat melihat di mana pengecualian terjadi, Anda dapat melacak kembali rantai panggilan untuk mencari tahu apa masalahnya (salah menggunakan pustaka, bug, dll.).


Saya telah mendengar sedikit tentang rasa sakit yang terkait dengan pengembangan SharePoint dan telah menjauh terutama karena alasan itu. Di sisi lain, sepertinya permintaan tinggi dan kompensasi khusus.
c152driver

Saya sudah melakukannya berulang-ulang selama 18 bulan terakhir (pekerjaan saat ini kebanyakan adalah SP) tapi saya bisa bilang saya bukan penggemar berat. Saya pikir banyak rasa sakit dari membuatnya melakukan hal-hal yang Anda mungkin tidak boleh di dalamnya dan hanya kurangnya dokumentasi. Pasti dalam permintaan tinggi dan jika Anda baik kompensasi lebih dari adil.
Ken Henderson

4

Reflektor sangat penting ketika Anda memiliki beberapa rakitan pihak ketiga yang harus Anda gunakan dan itu didokumentasikan dengan buruk atau memiliki bug di dalamnya dan Anda ingin tahu apa yang terjadi dengan kodenya.

Tentu, yang harus Anda lakukan adalah mengaburkan kode Anda dan Reflector tidak berguna (atau itu terakhir kali saya periksa) tetapi itu menyelamatkan saya banyak waktu dan frustrasi di masa lalu.

Juga, saya sudah memiliki setidaknya satu kesempatan di mana saya kehilangan kode sumber (di era kontrol pra-versi saya) tetapi memiliki kode yang dikompilasi dan Reflector membantu saya mendapatkan kode saya kembali. Dibutuhkan banyak pekerjaan karena komentar, nama variabel, dll salah tetapi itu membantu.

Juga, kadang-kadang Anda memiliki kode di, katakanlah, VB.NET dan Anda ingin melihat bagaimana hal itu dilakukan dalam, katakanlah, C # dan Reflector dapat beralih di antara berbagai bahasa.


Anda tampaknya telah menemukan alasan utama. Mungkin saya harus menganggap diri saya beruntung karena tidak sering menemukan diri saya dalam situasi seperti itu.
c152driver

3

Saat menggunakan Reflection.Emit untuk menghasilkan rakitan saat runtime, Reflector menjadi alat yang sangat berharga untuk memverifikasi secara visual kode yang dihasilkan seperti yang Anda harapkan.


2

Reflektor membantu Anda menemukan ketika dokumentasi salah. Saya menemukan bug dalam dokumentasi StringBuilder CLR kembali. NET 1.1. Dokumentasi untuk properti Length mengatakan ini:

Jika panjang yang ditentukan lebih besar dari panjang saat ini, akhir dari nilai string instance ini diisi dengan spasi.

Saya mencoba menggunakan StringBuilder dengan pemikiran ini, dan mendapatkan hasil yang aneh. Saya menggunakan Reflector, dan melihat masalahnya. Dokumentasi untuk properti Length di .NET 2.0 dan terus memiliki informasi yang benar:

Jika panjang yang ditentukan lebih besar dari panjang saat ini, akhir dari nilai string objek StringBuilder saat ini diisi dengan karakter Unicode NULL (U + 0000).

Ini dapat membuat perbedaan besar jika, katakanlah, Anda menampilkan teks yang dihasilkan dengan MessageBox; MessageBox memotong teks pada karakter nol pertama.

Reflector memungkinkan untuk menemukan hal-hal seperti ini, untuk melihat bagaimana sebenarnya perilaku CLR , berbeda dengan apa yang dikatakan dokumentasi, atau untuk menjawab pertanyaan yang tidak dijawab oleh dokumentasi.


1
... alasan lain untuk menggunakan Delphi di atas. NET. Anda benar-benar mendapatkan sumber untuk perpustakaan standar dan tidak perlu menggunakan dekompilasi untuk mengetahui apa yang sebenarnya mereka lakukan.
Mason Wheeler


1
@Mason: Ketika @Matthew menjawab, kode sumber untuk pustaka .NET tersedia secara bebas. Reflektor seringkali lebih nyaman untuk memeriksa hal-hal seperti ini, daripada harus repot-repot mengunduh sumbernya.
Adam Robinson

@ Adam: Menarik. Namun, fakta bahwa itu hanya tersedia sebagai unduhan terpisah, yang menurut Anda sulit untuk didapatkan, menggarisbawahi poin saya, setidaknya sampai tingkat tertentu.
Mason Wheeler

1

Terkadang lebih mudah untuk memahami apa yang dilakukan perpustakaan, bagaimana melakukannya, dan menggunakannya secara tepat dengan melihat kode sumbernya.

Di waktu lain, saya hanya ingin tahu dan ingin mengintip.

Cara umum lain yang saya gunakan Reflector adalah untuk melihat bagaimana Kerangka itu sendiri mengimplementasikan sesuatu.

Kadang-kadang, saya memiliki perpustakaan yang digunakan dalam proyek yang sangat lama dan kami tidak memiliki kode sumber atau dokumentasi. Reflektor sangat berharga dalam situasi-situasi itu.

Saya juga menggunakannya untuk rakitan hot-patch. Sudah ada beberapa kasus di mana saya perlu mengubah sedikit internal perpustakaan yang tidak dapat saya bangun kembali dan menggunakan Reflektor untuk menemukan titik yang sesuai dan kemudian memodifikasi IL perakitan (tidak, saya tidak berbicara tentang cracking, tetapi penggunaan yang sah dari fungsi ini).


0

Saya tidak akan mengatakan bahwa itu penting. Tetapi dalam kasus langka di mana Anda benar-benar membutuhkannya, itu sangat berguna.

Ambil sebuah contoh.

Baru-baru ini saya harus membuat beberapa kode yang dapat runtime membuat pohon ekspresi untuk yang berikut, tetapi tanpa mengetahui nama properti dependen pada waktu kompilasi:

Expression<Func<TMock, TDependency>> expression = (x => x.Dependency);

Untuk secara dinamis mengatur tiruan (menggunakan kerangka kerja Moq).

mock.Setup(expression).Returns(dependency);

Apa yang saya lakukan adalah mengkompilasi ekspresi asli menggunakan tipe beton, kemudian menggunakan reflektor, saya menemukan bahwa saya harus menulis kode berikut:

var argument = Expression.Parameter(typeof(TMock), "x");
var getPropertyExpression = Expression.Property(argument, propertyInfo.Name);
var lambda = Expression.Lambda<Func<TMock, TDependency>>(getPropertyExpression, argument);            
Expression<Func<TMock, TDependency>> expression = lambda;    

Saya akan bisa mencari tahu ini menggunakan trial and error. Tetapi reflektor membuatnya mudah.


0

Karena jika Anda tahu cara menggunakannya, Anda tidak memerlukan dokumentasi - dan sebagian besar API tidak memiliki dokumentasi yang berarti.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.