为什么Reflector如此重要?


10

阅读有关Reflector付费的烦恼使我思考了该产品及其用途。许多人似乎认为它是必不可少的工具。

我必须承认,多年以来我都没有使用Reflector。我的意思是,有.Net API和我使用的第三方组件的文档。过去,每当一位同事将Reflector从他的工具带中拉出时,我都会感觉到他正走向杂草丛生。

阅读有关Reflector的所有热情,使我开始怀疑我是否真的在这里遗漏了一些东西。为什么您经常需要诸如Reflector之类的东西,以至于您将其视为必不可少的工具?我可以看到在极少数情况下需要它,但不足以被认为是必不可少的工具。请赐教。


我很高兴地说,在当今时代,Reflector不再是一种必不可少的实用程序(除非您使用的是.NET的较旧版本)。现在,您可以访问.NET参考源,并查看CLR的内部工作原理,有趣的注释和所有内容。例如,这是我在下面的答案中谈到的StringBuilder.Length方法。您可以在第487行中看到,如果分配的长度更大,它将如何添加空字符而不是空格。
Kyralessa

Answers:


8

这是.NET Reflector可以为您解答的问题类型的完美示例

或者,您可以将其发布在SO上,然后让安装了Reflector的其他人为您回答。;)


我唯一的问题是那样使用是不合法的;)

@Pierre,你如何看待?如果没有别的,您可以使用这些参考源
source.microsoft.com/netframework.aspx

逆向工程规范在大多数发达国家是不合法的。当源代码在您的链接中发布时,它就没有用了;)

2
@Pierre 303:AFAIK版权法通常有一个例外,即允许进行逆向工程以与其他法律上使用的软件进行接口连接。此答案中的示例来自该类别。
Sharptooth

@sharptooth:您对此有一些参考吗?过去我曾遇到过这种情况,由于法律原因,我无法继续前进。我对此真的很感兴趣。

5

我会定期使用反射器(平均每周一次或两次)来帮助解决两个不同的问题。

  1. API /库的文档记录不充分:我最喜欢的示例是SharePoint。我认识的从事SharePoint开发的大多数开发人员都使用它来补充可用的文档。没有它,我们能否渡过难关?但是有很多情况会比较困难。

  2. 调试模糊的错误:在弄清为什么会引发异常的原因中,它也很有用。如果您可以看到发生异常的位置,则可以追溯到调用链以找出问题所在(错误地使用库,错误等)。


我已经听到很多有关SharePoint开发相关痛苦的信息,并且主要是出于这个原因而离开了。另一方面,这似乎是高需求和补偿良好的专业。
c152driver 2011年

在过去的18个月中,我一直在反复进行此操作(当前工作主要是SP),但我可以说我不是一个超级粉丝。我认为,很多麻烦来自于使它做您可能不应该做的事情,而只是缺少文档。绝对有很高的需求,如果您表现出色,那么补偿是不公平的。
肯·亨德森

4

当您必须使用某些第三方程序集,而该程序集的文档编写不充分或存在错误,并且您想知道其代码的运行状况时,Reflector必不可少。

当然,您要做的只是混淆代码,而Reflector没用(或者这是我上次检查的时间),但是过去为我节省了很多时间和沮丧。

另外,至少有一次我丢失了源代码(在我的版本控制之前的时代),但是编译后的代码和Reflector帮助我恢复了代码。需要很多工作,因为注释,变量名等是错误的,但它有所帮助。

另外,有时您在VB.NET中包含代码,并且想查看如何在C#中实现,并且Reflector可以在各种语言之间进行切换。


您似乎受到了主要的原因。也许我应该认为自己很幸运,因为即使没有,我也很少经常遇到这种情况。
c152driver 2011年

3

当使用Reflection.Emit在运行时生成程序集时,Reflector成为一种非常有价值的工具,可以直观地验证生成的代码是否符合您的期望。


2

Reflector可帮助您发现文档错误的时间。我在.NET 1.1的CLR的StringBuilder文档中发现了一个错误。Length属性的文档说:

如果指定的长度大于当前长度,则此实例的字符串值的末尾将用空格填充。

我考虑到这一点尝试使用StringBuilder,并得到了奇怪的结果。我使用了Reflector,然后看到了问题。.NET 2.0及更高版本中Length属性的文档具有正确的信息:

如果指定的长度大于当前长度,则当前StringBuilder对象的字符串值的结尾将填充Unicode NULL字符(U + 0000)。

例如,如果您要使用MessageBox显示结果文本,则可能会有很大的不同。MessageBox会截断第一个空字符处的文本。

Reflector可以发现类似这样的事情,了解CLR的实际行为,与文档所说的相反,或者回答文档没有回答的问题。


1
...但这是在.NET上使用Delphi的另一个原因。实际上,您可以获取标准库的源代码,而不必通过反编译它们来确定它们的实际作用。
梅森惠勒


1
@Mason:正如@Matthew回答的那样,.NET库的源代码是免费提供的。Reflector通常比检查下载源的麻烦更方便检查此类事情。
亚当·罗宾逊

@亚当:有趣。尽管如此,事实上它只能作为单独的下载来使用,这对您来说很麻烦,至少在一定程度上强调了我的观点。
梅森惠勒

1

有时,更容易理解库的工作方式,运行方式并通过查看其源代码适当地使用它。

其他时候,我只是好奇,想偷看。

我使用Reflector的另一种常见方式是查看框架本身是如何实现的。

有时,我在一个非常老的项目中使用了一个库,但是我们没有任何源代码或文档。在这些情况下,Reflector的价值非常大。

我还用它来热修补程序集。在某些情况下,我需要调整无法重建的库的内部部分,并无法使用Reflector找到合适的点,然后修改程序集的IL(不,我不是在谈论破解,而是合法的使用此功能)。


0

我不会说这是必不可少的。但是在您真正需要它的极少数情况下,它非常有用。

举个例子。

最近,我不得不创建一些代码,这些代码可以在运行时为以下代码创建表达式树,但在编译时却不知道依赖属性的名称:

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

为了动态设置一个模拟(使用Moq框架)。

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

我所做的是我使用具体类型编译了原始表达式,然后使用了反射器,发现我必须编写以下代码:

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;    

我本可以通过反复试验弄清楚这一点。但是反射器使它变得容易。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.