13

私の質問はCLRローダーに関するものだと思います。CorFlags.exe /32BIT+機能の背後にあるメカニズムを理解したい。

64 ビット Windows でAny CPUフラグを設定してコンパイルされたアセンブリを開始すると、64 ビット プロセスとして開始されることがわかっています。そのアセンブリで実行CorFlags /32BIT+すると、32 ビット プロセスとして開始されます。これは魅力的な機能だと思います。

私はそれについて非常に多くの質問があります:

  1. それはどのように実装されていますか?
  2. OS ローダーは関与しますか?
  3. 希望に応じて 32 ビットまたは 64 ビットの CLR をロードするカスタム アプリケーション (管理されていないアプリケーションだと思います) を構築することは可能ですか?

この機能の内部動作を説明している記事、本、ブログなどはありますか?

4

2 に答える 2

7

これは、私が知っている場所では十分に文書化されていません。関連する 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 関数を呼び出します。ただし、この関数はアクションを実行しません。戻るだけです。

于 2012-05-01T01:09:24.653 に答える