2012-04-17 20 views
8

現在のアプリケーションの実行時にCLR IDを取得する場所はありますか?私は、パフォーマンスモニタを使用してシステムを監視していますし、インスタンスのために使用される名前は次のとおりです。CLR IDの取得

ApplicationName.exe_p4952_r15_ad1 

私はプログラム的に他のすべてのパラメータを取得することができなくr15共通言語ランタイム(インスタンス)の実行時のIDである実行しますあなたのコード。私はそれが常に15であることに気づいたが、合併症を避けるために動的にするのが最善である。

+0

Process.GetProcessesを使用するとあなたが助けになりますか? http://msdn.microsoft.com/en-us/library/system.diagnostics.process.getprocesses.aspx –

+0

私は探しているものを持っていないようです。 – TheGateKeeper

+0

それは新規です。 "p4952"と "ad1"はどういう意味ですか?これはあなた自身のカウンターですか?次に、作成に使用したコードを投稿します。 –

答えて

3

「サフィックス」、つまりApplication.exeの後ろの部分は、.NETフレームワーク(たとえば、パフォーマンスカウンター)と同じインフラストラクチャを使用して取得できます。

これは可能な方法System.Runtime.Versioning.VersioningHelper.MakeVersionSafeNameがあります。このメソッドは「インフラストラクチャ」と記述され、「このAPIは.NET Frameworkインフラストラクチャをサポートし、コードから直接使用するためのものではありません」と記載されていますが、それでも公開されています。私はあなたが望む情報を得るための "より良いサポート"方法はないと思います。少なくとも、将来の変更に対してより堅牢で弾力性があり、次にドキュメントに基づいて情報をリバースエンジニアリングする必要があります。

string suffix = System.Runtime.Versioning.VersioningHelper.MakeVersionSafeName("",       
    System.Runtime.Versioning.ResourceScope.Machine, 
    System.Runtime.Versioning.ResourceScope.AppDomain)); 

たとえば、_p4472_r16_ad1を返します。

もちろん、パフォーマンスカウンタのベース名を直接渡してフルネームを直接取得することもできます。上記の空文字列の使い方は、単に "接尾辞"を得るためのトリックです。

string str = VersioningHelper.MakeVersionSafeName("Application.exe", 
    ResourceScope.Machine, ResourceScope.AppDomain); 

// str -> "Application.exe_p4472_r16_ad1". 

クラスVersioningHelpersもプライベートメソッドGetRuntimeId()を持っていますが、上記を与え、私はあなたが必要なものを達成するためにリフレクションを使用することがneccessaryであるとは思いません。

+0

本当にありがとう!私はこの情報を入手する方法があることを知っていました。この方法は完璧です。私は古い "ピース"ビルダーを投げ捨て、代わりにこれを使用して、完全な文字列をそれ自身のものに戻します。また、これはperformaceカウンタが使用するものなので、私はそれが実行されるマシンの99%で動作することを確信できます:) – TheGateKeeper

0

あなたが取得する文字列を分割することにより、容易にそれを見つけることができます。

この関数は、インスタンス名を分割して、「R」で始まり、「.EXE」で終わっていない部分のみを検索します。文字列の右部分が見つかったら、最初の文字 "r"を削除して番号をそのまま整数に変換して返します。 CLR IDが見つからない場合は、親関数に通知するために "-1"を返します。

int getClrID(string instance_name) 
    { 
     string[] instance_name_parts = instance_name.Split('_'); 
     string clr_id = ""; 

     for (int i = 0; i < instance_name_parts.Length; i++) 
     { 
      if (instance_name_parts[i].StartsWith("r") && !instance_name_parts[i].EndsWith(".exe")) 
      { 
       clr_id = instance_name_parts[i]; 
       break; 
      } 
     } 

     if (clr_id == "") // An error occured ... 
      return -1; 
     else 
      return Convert.ToInt32(clr_id.Substring(1)); 
    } 

私はあなたを助けたと思います。私の知る限り、その値がどうなるかを予測する方法はありません見ることができるよう

+0

こんにちは、努力をいただきありがとうございますが、これは役に立たないです。もし私が何とか私のコードに完全な文字列を持っていたら、それを分割してCLR Idを取得する必要はありません。そのまま使用します。コードからCLR IDを取得する方法が必要です。 – TheGateKeeper

1

- ここMSDN page you linked(強調鉱山)からの引用である

runtimeIDが共通言語ランタイムの識別子です。それはアプリケーションmyapp.exeホスト2つのCLRは、2つのインスタンスが異なるプロセスIDが、同じCLRランタイムIDを有するように見える例ではしかしランタイムれる例を示したように

物品が若干混乱あります。

しかし、この記事では、CLRランタイムIDの値がどのようなものか、それを見つける方法については何の約束もしていません(それは番号でも記載されていません)。あなたはそれが何であるかを理解することに頼るべきではありません。

私のアプローチはおそらく、すべてのPerfmonカウンタを列挙し、PIDに一致するものを監視することです。複数のコンポーネントがある場合(.Net 2.0コンポーネントを使用している場合に発生します)、両方を監視するだけです。

あなたは何をしようとしているかについてさらに情報を提供できますか?

+0

私はアプリケーションのネットイン/アウトを監視しています。マイクロソフトでは、この「未知」の変数を式に含めるのはなぜですか?それはちょうどappname [appID]だったので、使用するのはとても簡単でした...今は本当に混乱しています。私はすべてのインスタンスを列挙してアプリケーション名を見つけることができますが、むしろそれをやりたいと思います。私は解決策を探し続けるつもりです。 – TheGateKeeper

+0

@TheGateKeeperそれでは、両方を監視して値を合計することはできませんか? – Justin

+0

perfmonで実行されているすべてのインスタンスからインスタンス名を分離することができますが、それは私にとって理想的な解決策ではありません。この変数を取得するには何らかの方法が必要です。識別子に含めると非表示にすることは不可能です。 – TheGateKeeper