如何从.dll中读取完整的源代码?

时间:2010-11-02 06:57:50

标签: c#-4.0

我们的团队开发了工具,用于查找项目中Changed方法的参考。 1.我们使用反射来读取命名空间,类名和方法名称的e.t.c. 2.我们开始在cs文件中搜索方法体,并存储在List中。 3.我们采取了各种方法来寻找参考文献 但我已经看到反射器工具使用.dll读取完整的源代码。 怎么会发生?有没有办法从反射中读取源代码?请帮我解决这个问题 提前致谢

2 个答案:

答案 0 :(得分:3)

Reflector实际上并没有读取源代码 - 因为它不在那里。相反,它需要IL并对其进行反编译,找出源代码可能的样子。

这就是它能够以多种语言显示代码的方式 - 显然代码不是实际上用VB和C#编写的,但是Reflector可以通过计算出什么来显示代码确实并试图找到可以做同样事情的源代码。

(顺便说一句,它不是总是成功。有时会有一些IL,它们是由C#编译器从迭代器块或async方法生成的,其中没有直接等效的有效C#。)

答案 1 :(得分:0)

这样做实际上是一个多步骤的过程。你将从DLL或EXE获得的只是IL字节码,它本质上是一种抽象的机器语言。 IL字节码可以一对一翻译成IL汇编语言(例如ILDASM或Reflector的原始IL模式)。

Reflector的C#语言反编译模式更进一步,从类似if / elsewhile循环,切换语句等的代码中挑选结构并进行翻译那到相应的陈述。有关局部变量名称的信息不会保留在IL中,因此它必须随着时间的推移进行处理;此外,某些控制结构可能已经过优化而无法轻易识别,因此往往会导致生成goto语句。还有一些构造在C#语言中没有直接的相似之处,因此您可以在反编译代码中找到非正式的扩展关键字,例如methodof

一个有趣的练习是检查在反编译为该语言的早期版本时如何翻译更新的C#代码。例如,LINQ查询推导被翻译为IEnumerable<T>上的方法链,并且传递给Expression<T>参数的lambdas被一大堆goo替换为构建并传递对应于lambda的抽象语法树 - 实际上,编译器将这些结构转换为什么。