2011-02-10 21 views
6

.NETのコンパイルは、2つのフェーズ実行時間VSコンパイル時間(.NET)

  • 1を有しています。 ILコードへのコンパイル。

  • 2。 JITのネイティブコードへのコンパイル。

これらの段階はどちらもコンパイル時に分類できますか? JITコンパイルがネイティブコードに実行時に行われますか?

フェーズ2でエラーが発生した場合は、ランタイムエラーですか?

MSILへのC#のコンパイルとネイティブコードにMSILをコンパイルするには2をしている - 私の理解あたりとして

答えて

4

(フェーズ2すなわち後に発生したエラーは、ネイティブコードが実際に実行された場合、実行時エラーでなければなりません)コンパイルプロセスの段階。両方の段階で発生するエラーはコンパイル時エラーです。

ただし、第2段階(JIT)でコンパイルエラーが発生する可能性は低いです。 C#コードがMSILに正しくコンパイルされていれば、問題なくネイティブコードに確実にJITされます。

IMO JITingで最も重要なことは、ネイティブプラットフォームの最適化です。

ランタイムエラーは、JITedネイティブコードの実行中に発生するエラーです。

+1

あなたのMSILが_verifiable_ILである必要があります。検証不可能なILは、通常のアセンブラのようにバッファオーバーフローやその他のバグを引き起こすことがあります(例外をスローするCLRによって検出されることがよくあります)。 – thecoop

+0

http://download.microsoft.com/download/2/4/d/24dfac0e-fec7-4252-91b9-fb2310603f14/CLRUnderTheHood.BradA.ppt PPTによると、JITコンパイラとネイティブコードの両方がこれは、ILにコンパイルするときだけコンパイル時に を意味するはずです。 JITフェーズは実行時間にする必要があります。 関連する他のプレゼンテーションは、下記のリンクからアクセスできます http://download.microsoft.com/download/e/2/1/e216b4ce-1417-41af-863d-ec15f2d31b59/DEV490.ppt – rjv

0

JITコンパイルが失敗するケースは、System.Reflection.Emitメンバーで動的アセンブリを構築する場合です。

私はそれをランタイムエラーと考えています。コンパイル時エラーは、C#コンパイラがILを発行するコードでエラーを検出したときに発生するエラーです。