C# 如何成为MSIL专业人士?

C# 如何成为MSIL专业人士?,c#,cil,C#,Cil,我花了几个小时在一个调试问题上,只是为了让一个更有经验的人看看IL(类似于00400089 mov dword ptr[ebp-8],edx)并指出问题。老实说,这看起来像希伯来语-我不知道它到底在说什么 我在哪里可以学到更多关于这方面的知识,给周围的人留下深刻印象?我的目标是阅读以下内容并发表评论,比如:是的,你有一个比赛条件 .maxstack 2 .entrypoint .locals init (valuetype [MathLib]HangamaHouse.MathClass mcla

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

我在哪里可以学到更多关于这方面的知识,给周围的人留下深刻印象?我的目标是阅读以下内容并发表评论,比如:是的,你有一个比赛条件

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

ldloca mclass
ldc.i4 5

这不是MSIL,它是汇编语言langauge 80x86。

要在IL上取得成功,请从这篇精彩的文章开始:。虽然上面写着“介绍”,但这是你开始感到舒适所需要的一切

你需要的另一部分是练习和大量的练习。使用并开始查看分解为IL的代码。(提示:当你下载它时,你不必提供真正的电子邮件。)另外,在Reflector中使用插件。这里有一个很好的起点:


这不是必需的,但有一个好处:Reflexil是开源的。你可以得到来源。

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

一方面,没有什么比良好的汇编语言技能更能教会你计算机的实际操作。在某种程度上,MSIL是一种类似于汇编的语言。不利的一面是,再也没有机会进行这种发展了

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

(如果你想知道的话,问题是我想用“as”来进行安全铸造,但“as”不起作用,但“is”起作用。我的同事指出,“is”和“as”使用相同的MSIL。真正的问题是“as”仅适用于强制类型转换类,并且没有对泛型声明的适当约束,C#不知道您的泛型类型是否将是类。事实上,我在泛型中使用的类型是值类型;“as”根本不适用于这些类型。)


与其追求MSIL技能,我还是强烈推荐杰弗里·里希特的书,即使在多年努力钻研C#之后,这本书仍然充满了启示——我从每一页都学到了一些东西。

不能说我是IL“专业人士”,但我通过以下几点成功地自学了几乎所有的IL:

  • 写一个很短的(两行或三行)C#程序,你对如何用IL编写感到好奇

  • 编译程序

  • 在中打开已编译的EXE

  • 查看Reflector中方法的IL代码

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


多年前,我曾在assembly工作过几年,最近一次是在一个AES加密例程上,我可以告诉你,你不应该试图通过钻研assembler来削弱你学习c#的努力。如果您的原始代码是c#,您应该能够在原始代码中检测到竞争条件。
as
不适用于值类型的原因是,值类型不能为
null
,但是
as
希望在变量不是提供的类型时返回
null
。如果您知道泛型类型参数
T
是值类型(即您已指定
struct
约束),则可以使用
作为T?
而不是
作为T
,即使实例实际上是
T
类型而不是
T?
,它也会工作。然而,这纯粹是一个C语言问题,与IL或CLR没有什么关系…@Timwi,完全正确;“as”不能在值类型上返回null,这与IL完全无关。这就是重点;学习IL并不能帮助你解决这样的问题。无论这纯粹是一个语言问题,还是涉及到泛型的CLR实现,我不能说,但我会注意到VB.NET对强制转换的处理(通过DirectCast或TryCast)也有很多相同的问题。哈哈,“我在哪里可以学到更多关于这方面的知识并给周围的人留下深刻印象。”这是两个完全不同的问题,我的朋友;)除非你只和书呆子(像我一样)在一起,我想。。。