9

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

ApplicationName.exe_p4952_r15_ad1

他のすべてのパラメーターをプログラムで取得できますがr15、コードを実行する共通言語ランタイム (インスタンス) のランタイム ID は取得できません。常に 15 であることに気付きましたが、複雑さを避けるために動的に取得することをお勧めします。

4

3 に答える 3

5

「サフィックス」全体、つまり、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()、上記を考えると、必要なものを達成するためにリフレクションを使用する必要はないと思います。

于 2012-04-26T07:49:00.033 に答える
1

私が見る限り、その値がどうなるかを予測する方法はありません-これはあなたがリンクしたMSDNページからの引用です(私のものを強調してください)

runtimeID は共通言語ランタイム識別子です。

この記事は、アプリケーションmyapp.exeが 2 つの CLR ランタイムをホストする例を示しているため、やや混乱していますが、この例では、2 つのインスタンスのプロセス ID は異なりますが、CLR ランタイム ID は同じに見えます。

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

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

あなたがやろうとしていることについて、さらに情報を提供できますか?

于 2012-04-25T16:16:14.850 に答える
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));
    }

お役に立てば幸いです。

于 2012-04-25T15:17:19.030 に答える