Por que o Reflector é um utilitário tão essencial?

10

A leitura do brouhaha em torno do Reflector sendo pago me fez pensar sobre o produto e seus usos. Muitas pessoas parecem considerá-lo uma ferramenta essencial.

Eu tenho que admitir, eu não uso o Reflector há anos. Quero dizer, há documentação para as APIs .Net e os componentes de terceiros que eu uso. No passado, sempre que um colega puxava Reflector para fora do cinto de ferramentas, eu sentia que ele estava indo para o mato.

Ler toda a paixão em torno do Reflector está me levando a questionar se realmente estou perdendo alguma coisa aqui. Por que você precisa de algo como o Refletor com tanta frequência que o considera uma ferramenta essencial? Percebo que isso é necessário em ocasiões muito raras, mas não o suficiente para ser considerado uma ferramenta essencial. Por favor me esclareça.

c152driver
fonte
É um prazer dizer que, atualmente, o Reflector não é mais um utilitário tão essencial (a menos que você esteja usando versões muito mais antigas do .NET). Agora você pode visitar a fonte de referência .NET e ver o funcionamento interno do CLR, comentários divertidos e tudo. Por exemplo, aqui está o método StringBuilder.Length de que falei na minha resposta abaixo. Você pode ver na linha 487 como anexa caracteres nulos, não espaços, se você atribuir um comprimento maior.
21718 Kyralessa

Respostas:

8

Aqui está um exemplo perfeito do tipo de pergunta que o .NET Reflector pode responder por você.

Ou você pode publicá-lo no SO e deixar que outra pessoa com o Reflector instalado responda por você. ;)

Scott Whitlock
fonte
O meu único problema com isso é que não é legal para usá-lo assim;)
@ Pierre, como você acha? Se nada mais você poderia usar estes referencesource.microsoft.com/netframework.aspx
Matthew Whited
O código de engenharia reversa não é legal na maioria dos países desenvolvidos. E é inútil quando a fonte é publicada como no seu link;)
2
@Pierre 303: As leis de direitos autorais da AFAIK geralmente têm uma exceção, dizendo que é permitida a engenharia reversa para fazer interface com o software usado de outra forma legal. O exemplo nesta resposta é dessa categoria.
Sharptooth
@ sharptooth: você tem algumas referências sobre isso? Eu já estive em tais situações no passado e não fui capaz de avançar por causa da lei. Eu ficaria realmente interessado nisso.
5

Eu uso o refletor regularmente (talvez uma ou duas vezes por semana, em média) para ajudar com dois problemas diferentes.

  1. API / biblioteca mal documentada: meu exemplo favorito disso é o SharePoint. Quase todos os desenvolvedores que eu conheço desenvolvendo o SharePoint o utilizam para complementar a documentação disponível. Poderíamos sobreviver sem ele, na maior parte sim; mas houve vários casos em que teria sido bastante difícil.

  2. Depurando um erro obscuro: também pode ser útil para descobrir por que algo está lançando uma exceção. Se você puder ver onde ocorreu a exceção, poderá rastrear novamente a cadeia de chamadas para descobrir qual é o problema (usando incorretamente uma biblioteca, bug etc.).

Ken Henderson
fonte
Ouvi bastante sobre a dor associada ao desenvolvimento do SharePoint e fiquei longe, principalmente por esse motivo. Por outro lado, parece uma demanda alta e uma especialidade bem compensada.
C152driver
Venho fazendo isso de vez em quando nos últimos 18 meses (o trabalho atual é principalmente SP), mas posso dizer que não sou um grande fã. Eu acho que muita dor é por fazer coisas que você provavelmente não deveria fazer, e apenas a falta geral de documentação. Definitivamente em alta demanda e se você for bom, a compensação é mais do que justa.
Ken Henderson
4

O refletor é essencial quando você tem alguma montagem de terceiros que precisa usar e ela está mal documentada ou possui bugs e você deseja saber o que está acontecendo com seu código.

Claro, tudo o que você precisa fazer é ofuscar seu código e o Reflector é inútil (ou foi a última vez que verifiquei), mas isso me salvou muito tempo e frustração no passado.

Além disso, tive pelo menos uma ocasião em que perdi o código fonte (na minha era de controle de pré-versão), mas o código compilado e o Reflector me ajudaram a recuperar meu código. Precisava de muito trabalho porque comentários, nomes de variáveis ​​etc. estão errados, mas isso ajudou.

Além disso, às vezes você tem código no VB.NET, por exemplo, e deseja ver como isso seria feito, digamos, em C # e o Reflector pode alternar entre os vários idiomas.

Tom Kidd
fonte
Você parece ter acertado nos principais motivos. Talvez eu devesse me considerar sortuda por não ter me encontrado nessas situações com muita frequência, se é que realmente.
C152driver
3

Ao usar o Reflection.Emit para gerar assemblies em tempo de execução, o Reflector se torna uma ferramenta extremamente valiosa para verificar visualmente o código gerado, conforme o esperado.

Ed James
fonte
2

O Reflector ajuda a descobrir quando a documentação está errada. Eu encontrei um bug na documentação do CLB StringBuilder no .NET 1.1. A documentação para a propriedade Length dizia o seguinte:

Se o comprimento especificado for maior que o comprimento atual, o final do valor da sequência desta instância será preenchido com espaços.

Tentei usar o StringBuilder com isso em mente e obtive resultados bizarros. Eu usei o Reflector e vi o problema. A documentação para a propriedade Length no .NET 2.0 e forward tem as informações corretas:

Se o comprimento especificado for maior que o comprimento atual, o final do valor da string do objeto StringBuilder atual será preenchido com o caractere NULL Unicode (U + 0000).

Isso pode fazer uma grande diferença se, por exemplo, você estiver exibindo o texto resultante com uma MessageBox; o MessageBox corta o texto no primeiro caractere nulo.

O Reflector torna possível descobrir coisas como essa, ver como o CLR realmente se comporta, em oposição ao que a documentação diz, ou responder a perguntas que a documentação simplesmente não responde.

Kyralessa
fonte
11
... mais um motivo para usar o Delphi sobre .NET. Na verdade, você obtém a fonte das bibliotecas padrão e não precisa descompilá-las para descobrir o que elas realmente estão fazendo.
Mason Wheeler
4
novamente ... referenceource.microsoft.com/netframework.aspx
Matthew Whited
11
@Mason: Como o @Matthew respondeu, o código-fonte da biblioteca .NET está disponível gratuitamente. O Reflector geralmente é mais conveniente para inspecionar coisas como essa, em vez de passar pelo trabalho de baixar a fonte.
Adam Robinson
@ Adam: Interessante. Ainda assim, o fato de estar disponível apenas como um download separado, o que, de acordo com você, é um aborrecimento para obter, ressalta meu argumento, até certo ponto, pelo menos.
Mason Wheeler
1

Às vezes, é mais simples entender o que uma biblioteca está fazendo, como está fazendo e usá-la adequadamente, observando seu código-fonte.

Outras vezes, sou simplesmente curioso e quero espiar.

Outra maneira comum de usar o Reflector é ver como o próprio Framework implementa algo.

Ocasionalmente, tenho uma biblioteca sendo usada em um projeto muito antigo e não temos nenhum código-fonte ou documentação. Refletor é bastante inestimável nessas situações.

Eu também o usei para hot-patch assemblies. Houve alguns casos em que precisei ajustar um pouco interno de uma biblioteca que não consigo reconstruir e usar o Reflector para encontrar o ponto apropriado e modificar a IL do assembly (não, não estou falando de cracking, mas de usos legítimos de essa funcionalidade).

quentin-starin
fonte
0

Eu não diria que é essencial. Mas nos raros casos em que você realmente precisa, é altamente útil.

Veja um exemplo.

Recentemente, tive que criar um pedaço de código que pudesse criar a árvore de expressão em tempo de execução para o seguinte, mas sem saber o nome da propriedade dependente no momento da compilação:

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

Para configurar dinamicamente um mock (usando a estrutura Moq).

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

O que fiz foi compilar a expressão original usando tipos concretos e, em seguida, usando o refletor, descobri que precisava escrever o seguinte código:

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;    

Eu seria capaz de descobrir isso usando tentativa e erro. Mas o refletor facilitou.

Pete
fonte
0

Porque se você sabe como usá-lo, não precisa de documentação - e a maioria das APIs não possui documentação significativa.

Ladislav Mrnka
fonte