反射器的开源替代品是什么?

419

请问是否有人知道RedGate公司Reflector的开源替代品?我有兴趣了解一个类似于Reflector的工具是如何工作的。

请注意,如果您知道一个免费但非开源的Reflector替代品,您可以回答以下相关问题:

总结-更新于2011年5月11日

以下是各种开源项目和工具的快速概述:

  1. 通用编译器基础结构(CCI)
  2. Mono Cecil
  3. ILSpy
  4. dnSpy(ILSpy的分支, 该项目似乎比原始项目活跃)
  5. Dotnet IL Editor (DILE)
  6. IL.View
  7. Monoflector(自2011年4月以来不再活跃

以下资源也可能会引起兴趣:


2
请注意,现在有一个版本的v6将永久免费:http://eon.businesswire.com/news/eon/20110426007021/en/.NET-Reflector/Reflector/Red-Gate。 - thecoop
可能是比.NET反编译器更好的东西?的重复问题。 - Mat
2
@Matt,如果你查看日期,你会发现这个问题是在“有没有比.NET Reflector更好的替代品?”之前提出的。此外,这个问题特别询问开源替代方案。 - Tangiest
10个回答

175

2011年12月13日更新

以下开源工具可供使用:

  • ILSpy,由SharpDevelop团队提供。感谢Scott Hanselman的推文推荐该工具。
  • Dotnet IL Editor(一种反汇编工具)
  • IL.View - 一款用Silverlight 4编写的.NET Reflector替代品,作为一种离线Silverlight应用程序。有关详细信息,请参见这篇博客文章。

1
我几年前使用过Dile - 它是一个很棒的反汇编器和调试器 - 当时我强烈推荐它。不过我已经有一段时间没用它了。 - Jason Haley
8
ILSpy的当前版本(ILSpy v1.0.0.440,20010228)正在按照我的预期工作。我可以浏览方法、属性甚至C#库的源代码,而无需PDB文件。 - mathijsuitmegen
6
刚开始使用ILSpy,目前非常满意。完美的替代品。感谢SharpDevelop! - codemonkey
1
刚刚发现了这个工具,非常高兴看到.NET开发者工具箱中的一个替代品。一些反编译结果有点奇怪(字符串连接显示为IL所看到的方式,但不一定是代码实际编写的方式——这并不是坏事),但总体来说,这是一个很棒的工具! - CodeMonkey1313
5
我刚试用了ILSpy,它的表现非常出色!它甚至可以重构Lambda表达式和迭代器(“yield return”)方法……哇!我印象深刻! - Qwertie
显示剩余4条评论

37

另一种替代方案是dotPeek。JetBrains宣布它为免费工具。与它们的Resharper结合使用时,它可能会有更多的功能,但即使单独使用,它也很好用。

用户体验更像MSVS而不是一个独立的反汇编器。我更喜欢在Reflector中阅读代码。Ctrl+T导航对我更合适。只是树形结构与代码窗格之间的同步可能还需要改进。

总的来说,它仍在开发中,但已经非常易用了。


2
很棒的工具,但不是开源的。然而它是免费的,这可能会使任何开源等效工具黯然失色。 - Drew Noakes
Ferdinand,对于闭源工具给予负分。你应该尝试将这个问题添加到与Reflector相关的链接问题中。 - Tangiest
3
我在这里留下我的答案,以使信息更加完整。这个帖子是谷歌最容易找到的,而且这里列出的其他工具清单是最完整的。(顺便说一句,并不是所有这些工具都是开源的。) - Ferdinand Prantl
Ferdinand,我一直在给出闭源解决方案的所有答案投反对票,多次更新问题文本以明确我只对开源软件感兴趣,并确保问题摘要中的所有解决方案都是开源的。这个问题线程中只有另一个闭源解决方案,我也投了反对票。这个问题是在今年早些时候Redgate决定收费之前提出的,并且明确要求提供开源替代方案。我还需要做什么? - Tangiest
9
停止抱怨是一个开始。我通过Google找到了这个帖子,正在寻找免费的替代方案。我对它是否开源毫不在意。感谢@Ferdinand提供的dotPeek链接,看起来很有前途。 - Winston Smith
显示剩余3条评论

31

我知道两种选项。

  • CCI
  • Mono Cecil

但这些并不会提供给你C#。


Leppie,谢谢。虽然在你的答案和Jason Haley的答案之间做出选择很困难,但我还是接受了你的答案。 - Tangiest
CCI没有GUI前端(据我所知)。但在CodePlex的当前源代码中,有一个相当简单的API可以将反编译后的AST转换为C#。 - justin.m.chase
2
Mono.Cecil只是一个库,对吧? - Robert Jeppesen

15

Telerik今天发布了他们自己的反编译工具Beta版,JustDecompile。虽然是闭源软件,但免费且看起来很有前途。


Ray,抱歉,但为了与GrayWolf答案的方法保持一致,我不得不对这个答案进行负投票。这个问题是专门针对开源替代方案的。.NET社区通过依赖闭源解决方案而陷入了这种困境;无论提供工具的人是谁,我们都应该避免这种情况发生在未来。-1 - Tangiest
Ray,结果我的Kaliro建议也是一个闭源实用程序。请随意回报反对票 - 我应该得到它!不幸的是,您不能对自己的答案进行投票,无论是赞成还是反对。 - Tangiest
1
@MagicAndi - 删除你的答案比给它投反对票要容易得多。如果你认为它没有任何价值,那么你有权让它“消失”。 - jpierson
1
请不要删除或投票贬低此答案。其他有关免费替代方案的问题被管理员视为“重复”,因此这里的信息非常有价值。 - Alex from Jitbit
JustDecompile是一个非常有bug的应用程序,总是崩溃,并且在代码应该出现的地方显示了很多异常。除此之外,它非常缓慢。.NET Reflector比那个糟糕的东西好多了! - Elmue

12

ILSpy 做得很好!

据我所知,它可以完成 Reflector 的所有功能,并且界面也非常相似。


10

实际上,我相当确定 Reflector 被认为是一种具有某些反编译功能的反汇编器。它是一种反汇编器,因为它读取程序集文件中的字节并将其转换为汇编语言(在本例中是 ILasm)。

通过将 IL 解析成众所周知的模式(比如表达式和语句),Reflector 提供了反编译功能,这些模式然后被翻译成更高级别的语言,比如 C#、VB.Net 等等。如果你愿意,Reflector 的插件 API 允许你编写自己的语言翻译器... 但是,它将 IL 解析为表达式树的魔法是一个严密保密的秘密。

如果你想了解 IL 反汇编器的工作原理,我建议查看上述提到的任何一项:Dile、CCI 和 Mono 都是这方面的好资源。

我还强烈推荐获取 Ecma 335 规范和 Serge Lidin 的书。


这个链接似乎无法访问。 - Lyra
是的,抱歉去年我关闭了那个网站,但还没有重新建立。 - Jason Haley

8
我使用Reflector(以及我认为大多数人使用它的主要原因)是因为它的反编译器:它可以将方法的IL翻译回源代码。
在这方面,Monoflector 将是需要关注的项目。它使用Cecil进行反射,Cecil.Decompiler进行反编译。但是Monoflector在两个库的基础上添加了UI层,这应该让您对如何使用API有一个很好的了解。
Monoflector也是Reflector的一个不错的替代品。它允许您浏览类型并反编译方法,这是人们使用Reflector的99%。它非常粗糙,但我认为这将很快改变。

5

Reflector本身是一个.NET程序集,因此您可以在Reflector中打开Reflector.exe以查看它的构建方式。


14
不可以。反射器被混淆了。 - Jeff Yates
14
你不能在Reflector中打开Reflector?我刚刚做到了 - 模糊只是损害IL的可读性,因为标识符和类型名称被搅乱了,但这并不意味着你无法反汇编它。 - Andrew Hare
13
安德鲁 - 当你陷入困境时,停止挖掘...... - Tangiest
2
嗯...我有5.1.6.0版本,我可以很好地看到源代码 - 只有标识符名称被混淆了。不是完美的,但我现在正在查看Reflector的C#源代码。 :) - Andrew Hare
7
如果你试图使用反射器查看方法实现,你会在反射器中看到“这是混淆的”,它不会显示它,所以不能使用反射器。此外,在与问题提出者(OP)争辩细节方面是徒劳的。 - Jeff Yates
显示剩余5条评论

3

我目前正在开发一个名为Assembly Analyzer的开源反汇编器/反编译器。它能够为方法生成源代码,显示汇编元数据和资源,并允许您遍历依赖项。

该项目托管在CodePlex上 => http://asmanalyzer.codeplex.com/


1

反射工具使用反射。 - 显然这是不正确的。

您要求两件事情 - 展示反射器的代码,以及反射器的替代方案。

这里有一个例子,比反射器简化得多,但它展示了反射技术: TypeView.cs

我没有开源反射器替代方案的建议。


如果你所说的“Reflection”是指.NET框架中的“System.Reflection”,我非常怀疑。 - Christian.K
3
不,Reflector没有在框架中使用System.Reflection。Roeder非常早就声明了这一点,因为存在有关程序集加载和卸载的问题。 - casperOne
@casperOne,我不确定.NET Reflector内部的工作原理,但是自从.NET Reflector早期以来,System.Reflection命名空间已经得到扩展。现在它支持在反射上下文中加载和卸载程序集:https://dev59.com/GnVC5IYBdhLWcg3wpS7g - Drew Noakes
1
@Drew Noakes:这是真的,但据我所知,Roeder从未表示过他在进行此更改后已经回到Reflection。 - casperOne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接