これは、私が知っている場所では十分に文書化されていません。関連する MSDN の記事を紹介することしかできません。はい、あなたの仮定は正しいです。Windows XP以降のローダーは、管理された実行可能ファイルを認識しています。.NET ローダー shim (c:\windows\system32\mscoree.dll) を自動的に読み込みます。関連するエントリポイントは_CorValidateImage()です。リンクされた MSDN 記事の備考セクションでは、32 ビットの .exe ファイルを 64 ビット プロセスに変換するメカニズムについて説明しています。
Windows XP 以降のバージョンでは、オペレーティング システム ローダーは、共通オブジェクト ファイル フォーマット (COFF) ヘッダーの COM 記述子ディレクトリ ビットを調べて、マネージ モジュールをチェックします。セットされたビットは、マネージ モジュールを示します。ローダーがマネージ モジュールを検出すると、MsCorEE.dll を読み込み、_CorValidateImage を呼び出します。これにより、次のアクションが実行されます。
- イメージが有効なマネージド モジュールであることを確認します。
- イメージのエントリ ポイントを共通言語ランタイム (CLR) のエントリ ポイントに変更します。
- Windows の 64 ビット バージョンの場合、メモリ内のイメージを PE32 から PE32+ 形式に変換して変更します。
- マネージ モジュール イメージが読み込まれると、ローダーに戻ります。
実行可能イメージの場合、オペレーティング システム ローダーは、実行可能ファイルで指定されたエントリ ポイントに関係なく、_CorExeMain 関数を呼び出します。DLL アセンブリ イメージの場合、ローダーは _CorDllMain 関数を呼び出します。
_CorExeMain または _CorDllMain は、次のアクションを実行します。
- CLR を初期化します。
- アセンブリの CLR ヘッダーからマネージド エントリ ポイントを見つけます。
- 実行を開始します。
マネージ モジュール イメージがアンロードされると、ローダーは _CorImageUnloading 関数を呼び出します。ただし、この関数はアクションを実行しません。戻るだけです。