¿Alternativas de código abierto al reflector? [cerrado]

419

Solo para preguntar si alguien conoce una alternativa de código abierto para Reflector de RedGate . Estoy interesado en comprobar cómo funciona realmente una herramienta similar a Reflector.

Tenga en cuenta que si conoce una alternativa gratuita pero no de código abierto a Reflector, puede responder la siguiente pregunta relacionada:

Resumen - Actualizado el 11 de mayo de 2011

Un resumen rápido de los diversos proyectos y herramientas de código abierto que se han sugerido:

  1. Infraestructura del compilador común (CCI)
  2. Mono Cecil
  3. ILSpy
  4. dnSpy (bifurcación de ILSpy, el proyecto parece más activo que el original)
  5. Dotnet IL Editor (DILE)
  6. IL.View
  7. Monoflector ( ya no está activo a partir de abril de 2011)

Los siguientes recursos también pueden ser de interés:

MagicAndi
fuente
2
Para su información, ahora hay una versión de V6 que va a ser libre indefinidamente: eon.businesswire.com/news/eon/20110426007021/en/.NET-Reflector/...
thecoop
posible duplicado de algo mejor que .NET Reflector?
Mat
2
@Matt, si verifica las fechas, esta pregunta se hizo antes del reflector Something Better than .NET? pregunta. Además, esta pregunta está pidiendo específicamente alternativas de código abierto.
MagicAndi

Respuestas:

31

2 opciones que conozco.

  • CCI
  • Mono Cecil

Sin embargo, estos no te darán C #.

leppie
fuente
Leppie, gracias. Estoy aceptando esto como la respuesta, a pesar de que fue una elección difícil entre su respuesta y la de Jason Haley.
MagicAndi
CCI no tiene una interfaz gráfica de usuario (que yo sepa). Pero en la fuente actual en codeplex hay una API bastante simple para convertir el AST descompilado en C #, para su información.
justin.m.comprar
2
Mono.Cecil es solo una biblioteca, ¿verdad?
Robert Jeppesen
175

Actualizado el 13 de diciembre de 2011

Las siguientes herramientas de código abierto están disponibles:

MagicAndi
fuente
1
Utilicé el dile hace unos años, es un excelente desensamblador y depurador, lo recomendé mucho cuando lo estaba usando. Sin embargo, no lo he usado por un tiempo.
Jason Haley
8
La versión actual de ILSpy (ILSpy v1.0.0.440, 20010228) está funcionando como esperaba. Puedo examinar métodos, propiedades e incluso el código fuente de una biblioteca C # sin el archivo PDB.
mathijsuitmegen
66
Recién comencé a usar ILSpy. Muy feliz con eso hasta ahora. Reemplazo perfecto. Gracias SharpDevelop!
codemonkey
1
Acabo de encontrar esta herramienta, muy feliz de ver un reemplazo para un elemento básico en el cinturón de herramientas del desarrollador .NET. Algunas de las descompilaciones son un poco extrañas (la concatenación de cadenas aparece como IL lo vería, pero no necesariamente como se escribió el código, no es algo malo), pero en general, ¡es una gran herramienta!
CodeMonkey1313
55
¡Acabo de probar ILSpy y funciona muy bien! Incluso reconstruye expresiones lambda y métodos iteradores ("retorno de rendimiento") ... ¡guau! ¡Estoy impresionado!
Qwertie
38

Otro reemplazo sería dotPeek . JetBrains lo anunció como una herramienta gratuita. Probablemente tendrá más funciones cuando se use con su Resharper, pero incluso cuando se usa solo, funciona muy bien.

La experiencia del usuario se parece más a MSVS que a un desensamblador independiente. Me gusta leer códigos más que en Reflector. La navegación Ctrl + T también me queda mejor. Simplemente sincronizar el árbol con el panel de código podría ser mejor.

Con todo, todavía está en desarrollo, pero ya se puede usar muy bien.

Fernando Prantl
fuente
2
Gran herramienta, pero no de código abierto. Sin embargo, es gratis, lo que puede significar que roba el foco de atención de cualquier equivalente de código abierto.
Drew Noakes
Fernando, -1 para una herramienta de código cerrado. Debería intentar agregar esto a una de las preguntas vinculadas para Reflector.
MagicAndi
3
Dejo mi respuesta aquí para que la información sea más completa. Este hilo es el más fácil de encontrar en google y también la lista de otras herramientas aquí es la más completa. (No todos ellos son OSS por cierto.)
Ferdinand Prantl
Fernando, siempre he rechazado todas las respuestas que dan soluciones de código cerrado, actualicé el texto de la pregunta repetidamente para especificar que solo estoy interesado en OSS y me aseguré de que todas las soluciones en el resumen de la pregunta sean de código abierto. Solo hay otra solución de código cerrado en este hilo de preguntas, que también he rechazado. Esta pregunta se hizo antes de la decisión de Redgate de cobrar a principios de este año y específicamente pide alternativas de código abierto. ¿Qué más necesito hacer?
MagicAndi
99
@MagicAndi Dejar de quejarse sería un comienzo. Encontré este hilo de Google mientras buscaba una alternativa gratuita. No podría importarme menos si es de código abierto o no. @Ferdinand, gracias por el enlace dotPeek, parece prometedor.
Winston Smith
15

Telerik lanzó hoy una Beta de su propia herramienta de descompilación, JustDecompile . Fuente cerrada, pero gratuita y parece prometedora.

Ray Glover
fuente
Ray, disculpas, pero para ser coherente con el enfoque de la respuesta de GrayWolf, voy a tener que rechazar esta respuesta. Esta pregunta es específicamente para alternativas de código abierto. La comunidad .NET se permitió meterse en este desastre confiando en una solución de código cerrado; debemos evitar esto en el futuro, independientemente de quién proporcione la herramienta. -1
MagicAndi
Ray, resulta que mi sugerencia de Kaliro también es una utilidad de código cerrado. Por favor, siéntase libre de corresponder el voto negativo: ¡me lo merezco! Desafortunadamente, no puede votar sus propias respuestas, ya sea hacia arriba o hacia abajo.
MagicAndi
1
@MagicAndi: sería más fácil eliminar tu respuesta que rechazarla. Si no sientes que agrega ningún valor, entonces tienes el poder de hacer "desaparecer".
jpierson
1
No elimine / rechace esta respuesta. ¡Los moderadores están cerrando otras preguntas SO sobre alternativas gratuitas como "duplicados" de esta pregunta! entonces la información vale la pena estar aquí.
Alex
JustDecompile es una aplicación vergonzosamente defectuosa que se bloquea todo el tiempo y muestra muchas excepciones donde debería estar el código. Aparte de eso, es muy lento. ¡.NET Reflector es MUCHO mejor que esa basura!
Elmue
12

¡ILSpy funciona muy bien!

Por lo que puedo decir, hace todo lo que Reflector hizo y se ve igual.

Robar
fuente
10

En realidad, estoy bastante seguro de que Reflector se considera un desensamblador con algunas funciones de descompilador. Desensamblador porque lee los bytes del archivo de un ensamblado y lo convierte a un lenguaje ensamblador (ILasm en este caso). La funcionalidad del descompilador que proporciona al analizar el IL en patrones bien conocidos (como expresiones y declaraciones) que luego se traducen a idiomas de nivel superior como C #, VB.Net, etc. La API de complemento para Reflector le permite escribir su propio traductor de idiomas si desea ... sin embargo, la magia de cómo analiza el IL en los árboles de expresión es un secreto muy bien guardado.

Recomendaría mirar cualquiera de las tres cosas mencionadas anteriormente si desea comprender cómo funcionan los desensambladores IL: Dile, CCI y Mono son buenas fuentes para estas cosas.

También recomiendo obtener la especificación Ecma 335 y el libro de Serge Lidin también.

Jason Haley
fuente
este enlace parece estar inactivo
Lyra
Sí, lo siento, eliminé ese sitio el año pasado y no lo reemplacé.
Jason Haley
8

La razón principal por la que usé Reflector (y, creo, la razón principal por la que la mayoría de la gente lo usó) fue por su descompilador: puede traducir la IL de un método nuevamente en código fuente.

En ese sentido, Monoflector sería el proyecto a seguir. Utiliza Cecil, que hace la reflexión, y Cecil.Decompiler, que hace la descompilación. Pero Monoflector coloca una interfaz de usuario en la parte superior de ambas bibliotecas, lo que debería darle una muy buena idea de cómo usar la API.

Monoflector es también una alternativa decente a Reflector directamente. Le permite explorar los tipos y descompilar los métodos, que es el 99% de lo que la gente usaba Reflector. Es muy difícil, pero creo que eso cambiará rápidamente.

Joe White
fuente
5

Bueno, Reflector en sí es un ensamblado .NET, por lo que puede abrir Reflector.exe en Reflector para ver cómo está construido.

Andrew Hare
fuente
14
No puedes. El reflector está ofuscado.
Jeff Yates
14
¿No puedes abrir Reflector en Reflector? Lo acabo de hacer: la ofuscación simplemente perjudica la legibilidad de la IL ya que los identificadores y los nombres de tipo están destrozados, pero eso no significa que no se pueda desmontar.
Andrew Hare
13
Andrew: cuando
estés
2
Hmm ... Tengo la versión 5.1.6.0 y puedo ver la fuente muy bien, solo los nombres de los identificadores están ofuscados. No es perfecto, sí, pero estoy mirando la fuente C # de Reflector en este momento. :)
Andrew Hare
77
@ Andrew Hare: Si intentas ver las implementaciones de métodos a través del reflector en el reflector, verás "Esto está ofuscado" y no lo mostrará, así que no, no puedes usar Reflector. Además, ser pedante sobre lo que el OP quiere con el OP es una batalla perdida.
Jeff Yates
3

Actualmente estoy trabajando en un desensamblador / descompilador de código abierto llamado Assembly Analyzer. Genera código fuente para métodos, muestra metadatos de ensamblaje y recursos, y le permite recorrer las dependencias.

El proyecto está alojado en CodePlex => http://asmanalyzer.codeplex.com/

Codewhisperer84
fuente
1

La herramienta Reflector usa Reflection.   - Aparentemente esto no es correcto.

Usted solicitó dos cosas: código que muestra lo que hace el reflector, y también una alternativa al reflector.

Aquí hay un ejemplo, mucho más simplificado de lo que hace Reflector, pero muestra la técnica de reflexión: TypeView.cs

No tengo una sugerencia para un reemplazo de Reflector de código abierto.

Cheeso
fuente
Uhm, si con "Reflexión" te refieres a "System.Reflection" del marco .NET, dudaría mucho de eso.
Christian.K
3
@ Christian.K: No, Reflector no se usa System.Reflectionen el marco, Roeder lo dijo desde el principio debido a problemas con la carga y descarga del ensamblaje.
casperOne
@casperOne, no sé exactamente cómo funciona .NET Reflector internamente, pero el System.Reflectionespacio de nombres se ha ampliado desde los primeros días de .NET Reflector. Ahora es compatible con la carga y la descarga de ensamblajes en un contexto de solo reflexión: stackoverflow.com/questions/225330/…
Drew Noakes el
1
@Drew Noakes: Esto es cierto, pero Roeder nunca declaró (que yo sepa) que había regresado a Reflection una vez que se realizó este cambio.
casperOne