2011-09-06 91 views
3

假设我在我的解决方案中有一个C#Windows类库,并将其构建在我的VS2010 IDE中。 在我的bin目录这里的输出是X.dll什么时候生成MSIL?

1) X.dll不会在这个阶段,但“压缩字节代码”包含MSIL。
这是真的吗?

2)该“压缩字节码”以某种方式转换为MSIL。
这是什么时候发生的?

3)当访问X.dll时,CLR的JIT编译器将需要转换的部分MSIL转换为机器码。
我在这最后的部分很好吗?

任何人都可以帮助填补我在这里的理解空白吗?

+0

+1因为我从未见过“压缩字节码”。我认为它与MSIL的关系就像机器代码和汇编语言的关系,对吧? – xanatos

+0

我做了一些搜索。我发现了一个压缩字节代码的单引用:http://stackoverflow.com/questions/2665882/how-to-create-msil-files-from-dll-exe/2665891#2665891 – xanatos

回答

2

X.dll在使用Visual Studio进行构建后包含MSIL字节码。你可以用ildasm反汇编来证明这一点。

在程序集加载和代码的实际执行之间的某个时间,MSIL被转换为本机代码。我不熟悉这是做什么,但我会怀疑在组装负载。

+2

我的应用程序的exe文件包含C#码。你可以通过反射器分解来证明这一点。 :-P @xanatos错过了笑脸? – CodeCaster

+0

@Codecaster对不起:-)是的......它永远不会是我读过的最奇怪的东西:-) – xanatos

+0

MSIL字节码和MSIL之间的任何区别? – FuzzyFrog

0

要建立在黑暗猎鹰队的回答上,在第二个问题上,IL代码(非压缩字节代码)在每次首次调用时都由JIT编译器按方法逐次转换为本机代码。所以,第二个答案就是“当方法第一次访问时”。字段不受此限制,属性本身就是伪装的方法。

至于第三个问题,不,IL在加载时不会被打乱。往上看。

+1

它在被加载的模块和被调用的方法之间的某处出现。运行时通常会尽可能延迟它,但不能保证它会像第一次访问一样迟,特别是当[受限执行区域](https://msdn.microsoft.com/en-us/ library/ms228973%28v = vs.110%29.aspx)和[CriticalFinalizerObjects](https://msdn.microsoft.com/en-us/library/system.runtime.constrainedexecution.criticalfinalizerobject%28v=vs.110%29 .aspx)都参与其中。 –