c# 最大化表示 .netアプリケーションを起動するとどうなりますか?



process start c# (2)

うーん、私もこれでショットを取ることができます。

  1. 誰かがC#や.NETの「中間言語」などの管理言語で.NETアプリケーションを構築します。

  2. その言語用のコンパイラcsc.exe(C#)、またはilasm.exe(バイトコードアセンブラ)、またはいずれかのPE実行可能ファイルを生成します。 PE実行可能ファイルには、コンパイラまたはアセンブラが生成する特定の構造があります。 それは以下を含む:

    • エントリポイント、および
    • それが使用する動的ライブラリーのリスト(IMPORT表)。 これらのライブラリの1つはmscoree.dll
    • ターゲット.NETランタイムバージョンを含む多くのメタデータ
  3. 実行可能ファイルがクリックされるか、コマンドラインから実行されるか、Win32 APIから実行されると、(NTDLL.dllの) Windowsローダー実装が引き継ぎます

  4. ローダーコードは、実行可能ファイルをメモリにロードし、必要に応じてダイナミックリンクライブラリをロードし、リンクされたライブラリを実行可能コードが到達できる場所にマッピングし、マップされたライブラリの実際のアドレスでインポートアドレステーブルを更新する役割を担います。

  5. 一度すべての準備ができたら、ローダーはエントリーポイントにジャンプします(カーネルスペースからユーザースペースへの切り替え、または保護モードへの切り替えは、アプリケーションが32または64ビットのメモリ空間で保護されているためです)。 エントリポイントはmscoree.dllに移動します。これは.NETコモンオブジェクトランタイム実行エンジンで、プロセスメモリにマップされました。 私はこのDLLを.NET起動シムと呼んでおり、.NETの複数のインストールが1台のマシンに存在することを可能にしています。 Mscoree.dllは、通常のアプリケーションに.NET言語を埋め込む場合に使用するライブラリです。

  6. Mscoree.dllは、PE実行可能ファイル、特にCLRヘッダーと対象の.NETランタイムバージョンから読み込まれたメタデータを参照します。 それから、CorBindToRuntimeEx 2を適切なCLRバージョンにすることができます。

  7. CorBindToRuntimeExは、正しい.NETランタイム実装をロードします(そして、COMインタフェースへのポインタを返します。このコードは、%WINDIR%\ Microsoft.NET \ Framework \ v ####のdllからロードされます)。 #。

  8. 私はこの時点で誰であるか分かりませんが、mscoree shimは.NET ICLRRuntimeHostインターフェイスポインタを使用して.NETランタイム、ガベージコレクタ、ILインタープリタ、JITおよびIHostControlインターフェイスを初期化するメソッドを呼び出します。ホスティングプロセスに戻ります)、コンパイルされたアプリケーションのILコードの実行をインタープリターに指示します。

(私はたくさんのことを学びました - リンクの背後にはたくさんの情報があります。

mscoree.dll

2

http://msdn.microsoft.com/en-us/magazine/bb985994.aspx

私は.netを使ってかなりの時間アプリを開発しています。 しかし、私はまだCLRがどのように.NETアプリケーションが起動したのか分かりません。 アプリごとに1つのCLRインスタンスがありますか? 私はすべての.netアプリケーションのためのすべてのメモリを管理するただ1つのGCがあるので、これが当てはまるとは思わない。 CLRはバックグラウンドで実行されますか? 私はかなり混乱しています。


Answer #1

Windowsの実行可能ファイルは、Windowsにプログラムのロードと実行に必要な情報を与える形式のPortable Executablesです。 Windowsが.NETプログラムに遭遇すると、CLRのインスタンスがロードされ、新しいCLRインスタンスにプログラムの実行が渡されます。 実行中の各.NETプログラムは、CLRの独自のインスタンス内でホストされます。

CLRプロセスは、ILプログラムをロードしてネイティブコード(JIT)にコンパイルし、コードを実行して、そのプログラムのメモリ管理とガベージコレクションを処理します。





clr