¿Por qué es Reflector una utilidad tan esencial?


10

La lectura de la maraña que rodea a Reflector y que me paga me hizo pensar en el producto y sus usos. Muchas personas parecen considerarlo una herramienta esencial.

Tengo que admitir que no he usado Reflector en años. Quiero decir, hay documentación tanto para las API de .Net como para los componentes de terceros que uso. En el pasado, cada vez que un colega sacaba a Reflector de su cinturón de herramientas, tenía la sensación de que se dirigía hacia la maleza.

Leer toda la pasión en torno a Reflector me lleva a preguntarme si realmente me falta algo aquí. ¿Por qué necesita algo como Reflector con tanta frecuencia que lo considera una herramienta esencial? Puedo ver que se necesita en muy raras ocasiones, pero no lo suficiente como para ser considerado una herramienta esencial. Por favor iluminame.


Me complace decir que hoy en día, Reflector ya no es una utilidad tan esencial (a menos que esté utilizando versiones mucho más antiguas de .NET). Ahora puede visitar la Fuente de referencia .NET y ver el funcionamiento interno del CLR, comentarios divertidos y todo. Por ejemplo, aquí está el método StringBuilder.Length del que hablé en mi respuesta a continuación. Puede ver en la línea 487 cómo agrega caracteres nulos, no espacios, si asigna una longitud mayor.
Kyralessa

Respuestas:


8

Aquí hay un ejemplo perfecto del tipo de pregunta que .NET Reflector puede responder por usted.

O puede publicarlo en SO y dejar que otra persona con Reflector instalado lo responda por usted. ;)


Mi único problema con eso es que no es legal usarlo así;)

@Pierre, ¿cómo te imaginas? Si nada más podría usar estas referenciasource.microsoft.com/netframework.aspx
Matthew Whited

El código de ingeniería inversa no es legal en la mayoría de los países desarrollados. Y es inútil cuando la fuente se publica como en su enlace;)

2
@Pierre 303: las leyes de derechos de autor AFAIK a menudo tienen una excepción que dice que la ingeniería inversa en aras de la interfaz con el software legalmente utilizado está permitido. El ejemplo en esta respuesta es de esa categoría.
Sharptooth

@sharptooth: ¿tienes algunas referencias al respecto? He estado en tales situaciones en el pasado y no pude seguir adelante debido a la ley. Me interesaría mucho eso.

5

Utilizo el reflector de forma bastante regular (tal vez una o dos veces por semana en promedio) para ayudar con dos problemas diferentes.

  1. API / Biblioteca mal documentada: mi ejemplo favorito para esto es SharePoint. La mayoría de los desarrolladores que conozco sobre el desarrollo de SharePoint lo usan para complementar la documentación disponible. ¿Podríamos pasar sin él, en su mayor parte sí; pero ha habido varios casos en los que hubiera sido bastante difícil.

  2. Depuración de un error oscuro: también puede ser útil para descubrir por qué algo arroja una excepción. Si puede ver dónde se produjo la excepción, puede rastrear la cadena de llamadas para averiguar cuál es el problema (ya sea utilizando incorrectamente una biblioteca, error, etc.).


He escuchado bastante sobre el dolor asociado con el desarrollo de SharePoint y me he mantenido alejado principalmente por esa razón. Por otro lado, parece una gran demanda y una especialidad bien compensada.
c152driver

Lo he estado haciendo de vez en cuando durante los últimos 18 meses (el trabajo actual es principalmente SP) pero puedo decir que no soy un gran admirador. Creo que gran parte del dolor es hacer que haga cosas que probablemente no deberías hacer y solo la falta general de documentación. Definitivamente en alta demanda y si eres bueno, la compensación es más que justa.
Ken Henderson

4

Reflector es esencial cuando tienes un ensamblado de terceros que tienes que usar y está mal documentado o tiene errores y quieres saber qué está pasando con su código.

Claro, todo lo que tienes que hacer es ofuscar tu código y Reflector es inútil (o fue la última vez que lo revisé), pero me ahorró mucho tiempo y frustración en el pasado.

Además, tuve al menos una ocasión en la que perdí el código fuente (en mi era de control previo a la versión) pero tuve el código compilado y Reflector me ayudó a recuperar mi código. Necesitaba mucho trabajo porque los comentarios, nombres de variables, etc. están mal pero ayudó.

Además, a veces tiene código en, por ejemplo, VB.NET y desea ver cómo se haría, por ejemplo, C # y Reflector pueden cambiar entre los distintos idiomas.


Parece haber acertado en las principales razones. Quizás debería considerarme afortunado por no haberme encontrado en esas situaciones muy a menudo, si es que lo he hecho.
c152driver

3

Cuando se utiliza Reflection.Emit para generar ensamblajes en tiempo de ejecución, Reflector se convierte en una herramienta extremadamente valiosa para verificar visualmente que el código generado es el esperado.


2

Reflector lo ayuda a descubrir cuándo la documentación es incorrecta. Encontré un error en la documentación de StringBuilder de CLR en .NET 1.1. La documentación de la propiedad Longitud dice esto:

Si la longitud especificada es mayor que la longitud actual, el final del valor de cadena de esta instancia se rellena con espacios.

Traté de usar StringBuilder con esto en mente, y obtuve resultados extraños. Usé Reflector y vi el problema. La documentación para la propiedad Longitud en .NET 2.0 y versiones posteriores tiene la información correcta:

Si la longitud especificada es mayor que la longitud actual, el final del valor de cadena del objeto StringBuilder actual se rellena con el carácter NULL Unicode (U + 0000).

Esto puede hacer una gran diferencia si, por ejemplo, está mostrando el texto resultante con un cuadro de mensaje; MessageBox corta el texto en el primer carácter nulo.

Reflector permite descubrir cosas como esta, ver cómo se comporta realmente el CLR , a diferencia de lo que dice la documentación, o responder preguntas que la documentación simplemente no responde.


1
... otra razón más para usar Delphi sobre .NET. De hecho, obtienes la fuente de las bibliotecas estándar y no tienes que recurrir a descompilarlas para descubrir lo que realmente están haciendo.
Mason Wheeler


1
@Mason: como respondió @Matthew, el código fuente de la biblioteca .NET está disponible gratuitamente. Reflector es a menudo más conveniente para inspeccionar cosas como esta, en lugar de pasar por la molestia de descargar la fuente.
Adam Robinson

@ Adam: Interesante. Aún así, el hecho de que solo esté disponible como una descarga por separado, que según usted es una molestia para obtener, subraya mi punto, al menos en cierto grado.
Mason Wheeler

1

A veces es más simple entender lo que está haciendo una biblioteca, cómo lo está haciendo y usarla de manera apropiada al mirar su código fuente.

Otras veces, simplemente tengo curiosidad y quiero echar un vistazo.

Otra forma común en que uso Reflector es ver cómo el Framework mismo implementa algo.

En ocasiones, tengo una biblioteca en uso en un proyecto muy antiguo y no tenemos ningún código fuente o documentación. Reflector es bastante invaluable en esas situaciones.

También lo he usado para ensamblar parches en caliente. Ha habido algunos casos en los que he necesitado ajustar un bit interno de una biblioteca que no puedo reconstruir y usar Reflector para encontrar el punto apropiado y luego modificar la IL del ensamblado (no, no estoy hablando de grietas, sino de usos legítimos de esta funcionalidad).


0

No diría que es esencial. Pero en los raros casos en los que realmente lo necesita, es muy útil.

Toma un ejemplo.

Recientemente tuve que crear un fragmento de código que pudiera ejecutar en tiempo de ejecución el árbol de expresiones para lo siguiente, pero sin conocer el nombre de la propiedad dependiente en el momento de la compilación:

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

Para configurar dinámicamente un simulacro (usando el marco Moq).

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

Lo que hice fue compilar la expresión original usando tipos concretos, luego usando reflector, descubrí que tenía que escribir el siguiente 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;    

Hubiera podido resolver esto usando prueba y error. Pero el reflector lo hizo fácil.


0

Porque si sabe cómo usarlo, no necesita documentación, y la mayoría de las API no tienen ninguna documentación significativa.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.