Alternativas de código aberto ao refletor? [fechadas]

419

Só para perguntar se alguém conhece uma alternativa de código aberto ao Reflector da RedGate ? Estou interessado em verificar como uma ferramenta semelhante ao Reflector realmente funciona.

Observe que, se você souber de uma alternativa gratuita, mas não de código aberto, ao Reflector, poderá responder à seguinte pergunta relacionada:

Resumo - Atualizado em 11 de maio de 2011

Um rápido resumo dos vários projetos e ferramentas de código aberto que foram sugeridos:

  1. Infraestrutura comum do compilador (CCI)
  2. Mono Cecil
  3. ILSpy
  4. dnSpy (fork do ILSpy, o projeto parece mais ativo que o original)
  5. Editor do Dotnet IL (DILE)
  6. IL.View
  7. Monofletor ( não está mais ativo em abril de 2011)

Os seguintes recursos também podem ser interessantes:

MagicAndi
fonte
2
FYI, há agora uma versão do V6 que estará livre indefinately: eon.businesswire.com/news/eon/20110426007021/en/.NET-Reflector/...
thecoop
possível duplicata de algo melhor que o .NET Reflector?
26512 Mat
2
@ Matt, se você verificar as datas, essa pergunta foi feita antes do Refletor Something Better Than .NET? questão. Além disso, esta pergunta está especificamente pedindo alternativas de código aberto.
MagicAndi

Respostas:

31

2 opções que eu conheço.

  • CCI
  • Mono Cecil

Estes não lhe darão C #.

leppie
fonte
Leppie, obrigado. Estou aceitando isso como a resposta, mesmo que tenha sido uma escolha difícil entre sua resposta e a de Jason Haley.
MagicAndi 13/03
O CCI não possui um front-end da GUI (que eu saiba). Mas, na fonte atual do codeplex, existe uma API bastante simples para converter o AST descompilado em c #, fyi.
justin.m.chase
2
Mono.Cecil é apenas uma biblioteca, certo?
Robert Jeppesen
175

Atualizado 13 de dezembro de 2011

As seguintes ferramentas de código aberto estão disponíveis:

  • ILSpy da equipe SharpDevelop. Graças ao tweet de Scott Hanselman, destacando a ferramenta.
  • Dotnet IL Editor (um desmontador)
  • IL.View - uma alternativa do .NET Reflector escrita no Silverlight 4 como um aplicativo Silverlight fora do navegador. Veja esta postagem do blog para obter detalhes.
MagicAndi
fonte
1
Eu usei o dile alguns anos atrás - é um ótimo desmontador e depurador - eu o recomendei quando estava usando. Eu não uso há algum tempo.
Jason Haley
8
A versão atual do ILSpy (ILSpy v1.0.0.440, 20010228) está funcionando como eu esperava. Eu posso procurar métodos, propriedades e até mesmo o código fonte para uma biblioteca C # sem o arquivo PDB.
mathijsuitmegen
6
Apenas comecei a usar o ILSpy. Muito feliz com isso até agora. Substituição perfeita. Obrigado SharpDevelop!
Codigokey
1
Acabei de encontrar essa ferramenta, muito feliz em ver um substituto para um grampo no cinto de ferramentas do desenvolvedor .NET. Algumas das descompilações são um pouco estranhas (a concatenação de strings aparece como a IL o veria, mas não necessariamente como o código foi escrito - não é uma coisa ruim), mas no geral, uma ótima ferramenta!
CodeMonkey1313
5
Eu apenas tentei o ILSpy e funciona muito bem! Reconstrói até expressões lambda e métodos iteradores ("yield return") ... uau! Eu estou impressionado!
Qwertie 25/05
38

Outra substituição seria dotPeek . O JetBrains o anunciou como uma ferramenta gratuita. Provavelmente terá mais recursos quando usado com o seu Resharper mas mesmo quando usado sozinho, ele funciona muito bem.

A experiência do usuário é mais parecida com MSVS do que com um desmontador independente. Eu gosto mais de ler códigos do que no Reflector. A navegação Ctrl + T também me convém. Apenas sincronizar a árvore com o painel de código poderia ser melhor.

Em suma, ele ainda está em desenvolvimento, mas muito bem utilizável.

Ferdinand Prantl
fonte
2
Ótima ferramenta, mas não de código aberto. É gratuito, no entanto, o que pode significar que rouba os holofotes de qualquer equivalente de código aberto.
de Drew Noakes
Ferdinand, -1 para uma ferramenta de código fechado. Você deve tentar adicionar isso a uma das perguntas vinculadas do Reflector.
MagicAndi
3
Estou deixando minha resposta aqui para tornar as informações mais completas. Esta discussão é a mais fácil de encontrar pelo google e também a lista de outras ferramentas aqui é a mais completa. (Nem todos eles são OSS btw.)
Ferdinand Prantl
Ferdinand, reduzi consistentemente o voto de todas as respostas que fornecem soluções de código fechado, atualizei o texto da pergunta repetidamente para especificar que estou interessado apenas no OSS e certifiquei-me de que todas as soluções no resumo da pergunta sejam de código aberto. Há apenas uma outra solução de código fechado neste segmento de perguntas, que também diminuímos de voto. Essa pergunta foi feita antes da decisão da Redgate de cobrar de volta no início deste ano e pede especificamente alternativas de código aberto. O que mais eu preciso fazer?
precisa saber é o seguinte
9
@MagicAndi Pare de reclamar seria um começo. Encontrei este tópico do Google enquanto procurava uma alternativa gratuita. Eu não poderia me importar menos se é de código aberto ou não. @Ferdinand obrigado pelo link dotPeek, parece promissor.
Winston Smith
15

A Telerik lançou hoje uma versão beta de sua própria ferramenta de descompilação, JustDecompile . Código fechado, mas gratuito e parece promissor.

raio glover
fonte
Ray, pede desculpas, mas, para ser consistente com a abordagem da resposta do GrayWolf, terei que rebater esta resposta. Esta pergunta é especificamente para alternativas de código aberto. A comunidade .NET se permitiu entrar nessa confusão confiando em uma solução de código fechado; devemos evitar isso no futuro, independentemente de quem estiver fornecendo a ferramenta. -1
MagicAndi
Ray, minha sugestão do Kaliro também é um utilitário de código fechado. Sinta-se à vontade para retribuir o voto negativo - eu mereço! Infelizmente, você não pode votar em suas próprias respostas, para cima ou para baixo.
MagicAndi
1
@ MagicAndi - Seria mais fácil excluir sua resposta do que diminuir a votação. Se você não sente que isso agrega algum valor, então você tem o poder de fazer "desaparecer".
jpierson
1
Não remova / reduza o voto desta resposta. Outras perguntas do SO sobre alternativas gratuitas estão sendo fechadas como "duplicatas" desta pergunta pelos moderadores! então vale a pena estar aqui.
26413 Alex
JustDecompile é uma aplicação vergonhosamente com erros que trava o tempo todo e mostra muitas exceções onde o código deveria estar. Além disso, é muito lento. O .NET Reflector é MUITO melhor que essa porcaria!
Elmue
12

ILSpy funciona muito bem!

Tanto quanto posso dizer, ele faz tudo o que o Reflector fez e tem a mesma aparência.

Roubar
fonte
10

Na verdade, tenho certeza de que o Reflector é considerado um desmontador com alguma funcionalidade de descompilador. Desmontador, porque lê os bytes do arquivo de um assembly e o converte em uma linguagem assembly (neste caso, ILasm). A funcionalidade do Decompiler fornece analisando a IL em padrões conhecidos (como expressões e instruções) que são traduzidos para idiomas de nível superior como C #, VB.Net, etc. você deseja ... no entanto, a mágica de como ele analisa a IL nas árvores de expressão é um segredo bem guardado.

Eu recomendaria olhar para qualquer uma das três coisas mencionadas acima, se você quiser entender como os desmontadores de IL funcionam: Dile, CCI e Mono são boas fontes para essas coisas.

Também recomendo a especificação do Ecma 335 e o livro de Serge Lidin.

Jason Haley
fonte
este link parece estar em
falta
Sim, desculpe, eu derrubei o site no ano passado e não o substituí.
Jason Haley
8

A principal razão pela qual usei o Reflector (e, acho, a principal razão pela qual as pessoas o usaram) foi pelo seu descompilador: ele pode converter a IL de um método novamente em código-fonte.

Nesse sentido, o Monoflector seria o projeto a ser observado. Ele usa Cecil, que faz a reflexão, e Cecil.Decompiler, que faz a descompilação. Mas o Monoflector coloca uma interface do usuário em cima das duas bibliotecas, o que deve lhe dar uma boa ideia de como usar a API.

O Monoflector também é uma alternativa decente ao Reflector. Permite navegar pelos tipos e descompilar os métodos, que são 99% do que as pessoas usavam para o Reflector. É muito difícil nas bordas, mas acho que isso mudará rapidamente.

Joe White
fonte
5

Bem, o próprio Reflector é um assembly .NET, para que você possa abrir o Reflector.exe no Reflector para verificar como ele é construído.

Andrew Hare
fonte
14
Não, você não pode. O refletor está ofuscado.
Jeff Yates
14
Você não pode abrir o Refletor no Refletor? Acabei de fazê-lo - a ofuscação simplesmente prejudica a legibilidade da IL, já que identificadores e nomes de tipo são mutilados, mas isso não significa que você não pode desmontá-la.
Andrew Hare
13
Andrew - quando em um buraco, pare de cavar ...
MagicAndi
2
Hmm ... Eu tenho a versão 5.1.6.0 e posso ver a fonte muito bem - apenas os nomes do identificador são ofuscados. Não é perfeito, sim, mas estou vendo a fonte C # do Reflector agora. :)
Andrew Hare
7
@ Andrew Hare: Se você tentar observar as implementações de métodos via refletor no refletor, verá "Isso está ofuscado" e não será exibido, então não, não será possível usar o Refletor. Além disso, ser pedante sobre o que o OP quer com o OP é uma batalha perdida.
11118 Jeff Yates
3

Atualmente, estou trabalhando em um desmontador / descompilador de código aberto chamado Assembly Analyzer. Ele gera código-fonte para métodos, exibe metadados e recursos de assembly e permite percorrer dependências.

O projeto está hospedado no CodePlex => http://asmanalyzer.codeplex.com/

Codewhisperer84
fonte
1

A ferramenta Refletor usa Reflexão.  - aparentemente isso não está correto.

Você pediu duas coisas - código que mostra o que o refletor faz e também uma alternativa ao refletor.

Aqui está um exemplo, muito simplificado do que o Reflector faz, mas mostra a técnica da reflexão: TypeView.cs

Não tenho uma sugestão para uma substituição do Refletor de código aberto.

Cheeso
fonte
Uhm, se com "Reflexão" você se referir a "System.Reflection" da estrutura .NET, eu duvido muito disso.
Christian.K
3
@ Christian.K: Não, o Reflector não usa System.Reflectionna estrutura, afirmou Roeder desde muito cedo, devido a problemas com o carregamento e descarregamento de montagens.
precisa saber é o seguinte
@casperOne, não sei exatamente como o .NET Reflector funciona internamente, mas o System.Reflectionespaço para nome foi estendido desde os primeiros dias do .NET Reflector. Ele agora suporta o carregamento e montagens descarregados em um contexto somente de reflexão: stackoverflow.com/questions/225330/...
de Drew Noakes
1
@Drew Noakes: Isso é verdade, mas Roeder nunca afirmou (que eu saiba) que ele havia retornado ao Reflection depois que essa alteração foi feita.
casperOne