Perché Reflector è un'utilità così essenziale?


10

Leggendo il brouhaha che circonda Reflector, mi viene in mente il prodotto e i suoi usi. Molte persone sembrano considerarlo uno strumento essenziale.

Devo ammettere che non uso Reflector da anni. Voglio dire, c'è la documentazione sia per le API .Net che per i componenti di terze parti che utilizzo. In passato, ogni volta che un collega estraeva il Riflettore dalla cintura degli attrezzi, ho avuto la sensazione che fosse diretto verso le erbacce.

Leggere tutta la passione di Reflector mi porta a chiedermi se mi manca davvero qualcosa qui. Perché hai bisogno di qualcosa come Reflector così spesso da considerarlo uno strumento essenziale? Vedo che è necessario in occasioni molto rare, ma non abbastanza per essere considerato uno strumento essenziale. Per favore, illuminami.


Sono lieto di dire che oggigiorno Reflector non è più un'utilità così essenziale (a meno che non si utilizzino versioni molto più vecchie di .NET). Ora puoi visitare la fonte di riferimento .NET e vedere il funzionamento interno del CLR, commenti divertenti e tutto il resto. Ad esempio, ecco il metodo StringBuilder.Length di cui ho parlato nella mia risposta di seguito. Puoi vedere nella riga 487 come aggiungere caratteri null, non spazi, se assegni una lunghezza maggiore.
Kyralessa,

Risposte:


8

Ecco un esempio perfetto del tipo di domanda che .NET Reflector può rispondere per te.

Oppure puoi pubblicarlo su SO e lasciare che qualcun altro con Reflector installato risponda per te. ;)


Il mio unico problema è che non è legale usarlo in quel modo;)

@Pierre, come pensi? Se non altro potresti usare questi riferimentiource.microsoft.com/netframework.aspx
Matthew Whited,

Il codice di reverse engineering non è legale nella maggior parte dei paesi sviluppati. Ed è inutile quando la fonte viene pubblicata come nel tuo link;)

2
@Pierre 303: Le leggi sul copyright di AFAIK hanno spesso un'eccezione che afferma che è consentita la retroingegnerizzazione al fine di interfacciarsi con il software altrimenti legalmente utilizzato. L'esempio in questa risposta è di quella categoria.
sharptooth,

@sharptooth: hai qualche riferimento a riguardo? Sono stato in tali situazioni in passato e non sono stato in grado di andare avanti a causa della legge. Ne sarei davvero interessato.

5

Uso il riflettore su una base abbastanza regolare (forse una o due volte a settimana in media) per aiutare con due problemi diversi.

  1. API / libreria scarsamente documentata: il mio esempio preferito per questo è SharePoint. Quasi tutti gli sviluppatori che conosco per lo sviluppo di SharePoint lo usano per integrare la documentazione disponibile. Potremmo cavarcela senza di essa, per la maggior parte sì; ma ci sono stati diversi casi in cui sarebbe stato piuttosto difficile.

  2. Debug di un oscuro errore: può anche essere utile per capire perché qualcosa sta generando un'eccezione. Se riesci a vedere dove si è verificata l'eccezione, puoi risalire alla catena di chiamate per capire qual è il problema (utilizzando erroneamente una libreria, un bug, ecc.).


Ho sentito parlare un po 'del dolore associato allo sviluppo di SharePoint e sono rimasto lontano principalmente per questo motivo. D'altra parte, sembra una domanda molto richiesta e una specialità ben compensata.
c152driver

L'ho fatto a intermittenza negli ultimi 18 mesi (il lavoro attuale è principalmente SP) ma posso dire di non essere un grande fan. Penso che gran parte del dolore provenga dal fargli fare cose che probabilmente non dovresti includere e solo la generale mancanza di documentazione. Sicuramente molto richiesto e se sei bravo il risarcimento è più che giusto.
Ken Henderson,

4

Reflector è essenziale quando si dispone di un assembly di terze parti che è necessario utilizzare ed è scarsamente documentato o contiene bug e si desidera sapere cosa sta succedendo con il suo codice.

Certo, tutto ciò che devi fare è offuscare il tuo codice e Reflector è inutile (o era l'ultima volta che ho controllato) ma mi ha risparmiato un sacco di tempo e frustrazione in passato.

Inoltre, ho avuto almeno un'occasione in cui ho perso il codice sorgente (nella mia era di controllo pre-versione) ma avevo il codice compilato e Reflector mi ha aiutato a recuperare il mio codice. Ha richiesto molto lavoro perché commenti, nomi di variabili, ecc. Sono sbagliati ma ha aiutato.

Inoltre, a volte hai il codice in, diciamo, VB.NET e vuoi vedere come sarebbe fatto, diciamo, C # e Reflector possono passare da una lingua all'altra.


Sembra che tu abbia colpito i motivi principali. Forse dovrei considerarmi fortunato per non essermi trovato in quelle situazioni molto spesso, se non del tutto.
c152driver

3

Quando si utilizza Reflection.Emit per generare assiemi in fase di esecuzione, Reflector diventa uno strumento estremamente utile per verificare visivamente che il codice generato sia come previsto.


2

Reflector ti aiuta a scoprire quando la documentazione è errata. Ho trovato un bug nella documentazione StringBuilder del CLR in .NET 1.1. La documentazione per la proprietà Lunghezza diceva questo:

Se la lunghezza specificata è maggiore della lunghezza corrente, la fine del valore di stringa di questa istanza viene riempita di spazi.

Ho provato a usare StringBuilder con questo in mente e ho ottenuto risultati bizzarri. Ho usato Reflector e ho visto il problema. La documentazione per la proprietà Lunghezza in .NET 2.0 e successive contiene le informazioni corrette:

Se la lunghezza specificata è maggiore della lunghezza corrente, la fine del valore di stringa dell'oggetto StringBuilder corrente viene riempita con il carattere NULL Unicode (U + 0000).

Questo può fare una grande differenza se, ad esempio, stai visualizzando il testo risultante con un MessageBox; MessageBox interrompe il testo al primo carattere null.

Reflector consente di scoprire cose come queste, di vedere come si comporta realmente il CLR , al contrario di quanto afferma la documentazione, o di rispondere a domande alle quali la documentazione non risponde.


1
... ancora un altro motivo per usare Delphi su .NET. In realtà ottieni la fonte per le librerie standard e non devi ricorrere a decompilarle per capire cosa stanno realmente facendo.
Mason Wheeler,


1
@Mason: come ha risposto @Matthew, il codice sorgente per la libreria .NET è disponibile gratuitamente. Reflector è spesso più conveniente per ispezionare cose come questa, piuttosto che passare attraverso il fastidio di scaricare la fonte.
Adam Robinson,

@Adam: interessante. Tuttavia, il fatto che sia disponibile solo come download separato, che secondo te è una seccatura da ottenere, sottolinea il mio punto, almeno in una certa misura.
Mason Wheeler,

1

A volte è più semplice capire cosa sta facendo una libreria, come la sta facendo e usarla appropriatamente guardando il suo codice sorgente.

Altre volte, sono semplicemente curioso e voglio sbirciare.

Un altro modo comune in cui utilizzo Reflector è vedere come il Framework stesso implementa qualcosa.

A volte, ho una libreria utilizzata in un progetto molto vecchio e non abbiamo alcun codice sorgente o documentazione. Il riflettore è abbastanza prezioso in quelle situazioni.

L'ho usato anche per gli assembly hot-patch. Ci sono stati alcuni casi in cui ho dovuto modificare una parte interna di una libreria che non posso ricostruire e usare Reflector per trovare il punto appropriato e quindi modificare l'IL dell'assembly (no, non sto parlando di cracking, ma usi legittimi di questa funzionalità).


0

Non direi che è essenziale. Ma nei rari casi in cui ne hai davvero bisogno, è molto utile.

Fai un esempio.

Recentemente ho dovuto creare un pezzo di codice che potrebbe runtime creare l'albero delle espressioni per quanto segue, ma senza conoscere il nome della proprietà dipendente in fase di compilazione:

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

Al fine di impostare dinamicamente una simulazione (usando il framework Moq).

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

Quello che ho fatto è stato che ho compilato l'espressione originale usando tipi concreti, quindi usando reflector, ho scoperto che dovevo scrivere il seguente codice:

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;    

Sarei stato in grado di capirlo usando tentativi ed errori. Ma il riflettore lo ha reso facile.


0

Perché se sai come usarlo, non hai bisogno di documentazione e la maggior parte delle API non ha documentazione significativa.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.