2011-02-10 107 views
6

.NET编译有两个阶段运行时间编译VS时间(.NET)

  • 1。汇编到IL代码。

  • 2。 JIT编译为本地代码。

这两个阶段都可以归为编译时间吗? 或者JIT编译为本机代码是否在运行时?

就错误而言,如果在阶段2发生错误,它是运行时错误吗? (即第2阶段,即后发生的任何错误,当实际执行本地代码应该是一个运行时错误)

回答

4

按我的理解 -

编译C#为MSIL和编译MSIL到本地代码是两个编译过程的各个阶段。两个阶段发生的错误都是编译时错误。

但是,在第二阶段(JIT)中不会出现任何编译错误。如果你的C#代码编译正确的MSIL,那么它肯定会被JITed到本地代码没有任何问题。

IMO在JITing过程中发生的最重要的事情是对本地平台的优化。

运行时错误是在执行JITed本机代码期间发生的错误。

+1

这应该是如果你的MSIL是_verifiable_ IL;不可验证的IL可能会导致缓冲区溢出和其他错误,就像普通的汇编程序一样(尽管CLR通常会引发异常)。 – thecoop 2011-02-10 09:09:26

0

JIT编译可能失败的情况是在使用System.Reflection.Emit成员构建动态程序集时。

我认为它是一个运行时错误,编译时错误是当C#编译器检测到发出IL的代码中的错误时引发的错误。