如何成为MSIL专业版?

时间:2010-09-08 01:00:29

标签: c# cil

我花了好几个小时调试问题只是为了让一个更有经验的人看看IL(类似于00400089 mov dword ptr [ebp-8],edx)并指出问题所在。老实说,这对我来说就像希伯来语 - 我不知道它到底在说什么。

我在哪里可以了解更多有关这些内容并给我周围的人留下深刻印象?我的目标是阅读以下内容并发表评论:是的,你有竞争条件。

.maxstack 2
.entrypoint
.locals init (valuetype [MathLib]HangamaHouse.MathClass mclass) 

ldloca mclass
ldc.i4 5

4 个答案:

答案 0 :(得分:7)

那不是MAIL,它是汇编语言80x86。

答案 1 :(得分:4)

要想了解IL,请从这篇精彩的文章开始:Introduction to IL Assembly Language。虽然它说“介绍”,但它是你开始变得舒适所需的一切。

你需要的另一部分是练习和很多。使用.NET Reflector并开始查看反汇编为IL的代码。 (提示:当您下载它时,您不必提供真实的电子邮件。)另外,使用Reflector中的Reflexil插件。这是一个很好的起点:Assembly Manipulation and C# / VB.NET Code Injection

没有必要但是奖金:Reflexil是开源的。您可以获取来源here

答案 2 :(得分:3)

我可以给你一个双向的答案。

一方面,没有什么比汇编语言能力更好来教你如何真正运行电脑了。 MSIL在某种程度上是一种类似汇编的语言。在不利方面,再也没有机会进行这种开发了。

另一方面,通过查看MSIL来解决问题不一定是理解问题的最直接或最有教育意义的方式。在.NET编程的五年中,我从未觉得有必要去那里。只有一次有一个同事(他曾在微软从事编译器测试工作)去了那里,我试图解决一个问题,最后,他的回答是误导性的,因为真正的问题是基于CLR设计和约束。更好地了解CLR和C#会带来更好的理解和真正的解决方案。

(如果你想知道,问题是我想用“as”来安全地使用通用铸造。“as”不起作用,但是“是”。我的同事注意到“是“和”作为“使用相同的MSIL。真正的问题是”因为“只适用于转换类,并且没有对泛型声明的适当约束,C#不知道你的泛型类型是否是一个类。事实上,我使用泛型的类型是值类型;“as”根本不适用于那些。)

我强烈推荐杰弗里·里希特的书CLR via C#.,而不是追求MSIL技能。即使经过多年努力学习C#,这本书仍然充满了启示 - 我从每一页都学到了一些东西。

答案 3 :(得分:3)

不能说我是IL“专业人士”,但我通过以下方式成功地教导了我自己的所有IL:

  • 写一篇很短的(两三行)C#程序,你对如何在IL中写作感到好奇。

  • 编译程序。

  • .NET Reflector

  • 中打开已编译的EXE
  • 查看Reflector中方法的IL代码。

  • 将鼠标悬停在IL操作码(例如“ldloc”)上。 有一个描述每条IL指令的工具提示。