2009-06-03 8 views
10

私は2つの.NETアプリケーションを作成し、マシン上で実行します - CLRとgcの数はいくつですか?マシン上で実行されているCLRインスタンスとGCインスタンスの数はどれですか?

さらに、WindowsがCOMコンポーネントとCLRをどのように処理するかに関する背景情報をご希望です。

tasklist /m mscor* 

が、それは実際には複数のCLRまたはすべてのCOMサーバーとして単一のCLRです:誰かが、詳細はどのようにCLRメモリにロードし、私は、このコマンドを実行しているに記載されている複数のCLRインスタンスを取得する場合、それは意味のダウンことを願っています。 NETのプロセス?

答えて

8

各プロセスは、ホスティングプロセスとして独自のCLRのコピーを持ちます。しかし、CLRは実際にはDLLの2つだけなので、Windowsはプロセス間でDLLを共有できます。詳細については、http://msdn.microsoft.com/en-us/magazine/cc301727.aspx

0

実際には、CLRはMSILをネイティブマシンコードに変換するコンポーネントです。そのネイティブマシンコードは、各アプリケーションごとに独自のプロセスで実行されます。

そして、.NETの世界では、プロセスはappdomainと密接に関連しています。だから私はthisが良い出発点だと思うのです。

+0

downvoteについて詳しく教えてください。 – fretje

+0

私はリンクされた記事が質問に答えるために多くをしないと思う。あなたはあなたがあなたの答えに行った変更を使って、私にダウンボートの気分を悪くさせていますが。 –

1

ロードされたDLLを調べることによってCLRを実行またはロードするプロセスを簡単に数えることができます。しかし、あなたが実行しているアプリケーションドメインの数を数えることができるかどうかはわかりません。しかし、私はそれがあなたの目的だとは思わない。

プロセスあたり1つのヒープと1つのGCがあり、コレクション中にすべての管理対象スレッドを中断します。したがって、プロセスを繰り返して、mscorlibがロードされているかどうかを確認することができます。そうすれば、.NET CLRとGCを実行していると仮定できます。プロセスにCLRがホストされているかどうかを判断するためのより良い方法があるはずですが、CLR APIもチェックしてください。

もっと理解を深めるために、C#でJeffrey Richterの本CLRを試してください。

.NET Aはexeファイルを管理

// Import these namespaces 
using System.Diagnostics; 
using System.ComponentModel; 

// Here is the code 
Process[] prcs = Process.GetProcesses(); 
foreach (Process prc in prcs) 
{ 
    try 
    { 
     foreach (ProcessModule pm in prc.Modules) 
     { 
      if (pm.ModuleName.Contains("mscorlib")) 
      { 
       Console.WriteLine(prc.ProcessName); 
      } 
     } 
    } 
    catch (Win32Exception exWin) 
    { 
     // Cannot detemine process modules ... some will deny access 
    } 
} 
+0

コマンドプロンプトでtasklist/m mscor *を実行すると、上記のコードと同じことが実行されます。 – Gishu

+0

さて、sysinternalsのプロセスエクスプローラは、それがさらに良くなり、appdomainも表示します。私は質問がこれをプログラム的に決定することだと思った。 .NET appdomainsとthreadを特定したい場合は、この記事を参考にしてください。 http://msdn.microsoft.com/en-us/magazine/cc163900 .aspx#S6 –

6

処理反復以下のコードは、Portable Executable (PE format)に加えて追加のCLRヘッダを有しています。 OSは、起動されたexeが「管理された」exeであるかどうかを判断できるようになり、したがって、シーンの背後にあるCLRをロードして制御します。

  • にmscoree.dllは、シムのdll(このファイルの最新バージョンは、Windows/System32フォルダに常に存在しているので、CLRの現在および以前のバージョンをロードする方法を知っている。)である
  • のMscorwks.dll CLRの実際の実装です。複数のバージョンのフレームワークがインストールされている場合、このdllの複数のバージョンが見つかります。このdllの適切なバージョンはshim dllによって読み込まれます。

各管理対象実行可能ファイルのプロセスは、独自のCLR(2つのDLL)のコピーを持つことになります。 ManagedExecutable1はCLR v1を使用している可能性があります.ManagedExecutable2はCLR v2を使用している可能性があります。彼らは今のところ共有されていません。
ガーベッジコレクタはCLRの一部であるため、管理された実行可能ファイルのプロセス間でも区別されます。

+0

私は、CLRがCOMコンポーネントであるという考えを持っていました。これは、別のプロセスで別々のコピーとしてロードすることはできません。私の質問の目的は、「CLRがどのようにどのようなモードで実行されているのか.NETアプリケーションを実行しているマシンにどのようなモードがありますか?」ということです。これはOSによって一度だけロードされ、COM dllまたは – MSIL

+0

プロセスごとにロードされます.CLRはCOMで実装されています。複数のプロセスがそれぞれ異なるバージョンのCLRを実行している可能性があります。したがって、すべての.netプロセスに対して一度だけロードすることはできません。 – Gishu

関連する問題