web-dev-qa-db-ja.com

.NET4.0およびWindows7のパフォーマンスカウンター

VS2008とVistaで正常に動作するプログラムがありますが、Windows7とVS2010/.NET Framework 4.0で試していますが、動作しません。最終的に問題となるのは、 System.Diagnostics.PerformanceCounterCategory.GetCategories() (およびその他のPerformanceCounterCategoryメソッド)が機能していないことです。 System.InvalidOperationExceptionが発生し、「レジストリから無効なインデックス ''が読み取られたため、カウンタ名データを読み込めません。」というメッセージが表示されます。

以下に示す非常に単純なプログラムでこれを再現できます。

class Program
{
    static void Main(string[] args)
    {
        foreach (var pc in System.Diagnostics.PerformanceCounterCategory.GetCategories())
        {
            Console.WriteLine(pc.CategoryName);
        }
    }
}

私は管理者としてプログラムを実行していることを確認しました。 VS /デバッガーを接続して実行するかどうかは関係ありません。私はそれをテストするためのWindows7またはVS2010を搭載した別のマシンを持っていないので、どちらがここで物事を複雑にしているのか(または両方?)これはWindows7 x64であり、アプリをx32とx64の両方で強制的に実行しようとしましたが、同じ結果が得られます。

33
Scott Willeke

システムのパフォーマンスカウンターが破損しているようです。私は この投稿 に正確には従いませんでしたが、それは私を解決策に導きました。これが私がしたことです:

管理者/昇格権限を持つコマンドプロンプトで、次のように入力しました。

lodctr /?

そこにある便利なもの...

次に入力します:

lodctr /R

前のステップのドキュメントによると、これにより、現在のレジストリ設定とバックアップINIファイルに基づいて、パフォーマンスレジストリ文字列と情報を最初から再構築するためのウィンドウが取得されます。これが魔法のようなものだと感じていますが、次に.NETパフォーマンスカウンターがもうないことに気づきました this に基づいて次のように入力しましたそれらをリロードするには:

lodctr "C:\Windows\Microsoft.NET\Framework64\v4.0.20506\corperfmonsymbols.ini"

このパスは、x64上の.NET Framework4.0用であることに注意してください。フレームワーク/プラットフォームの他のバリエーションへの道を想像することができます。私はguessingですが、インストールした.NET Frameworkの最新バージョンから常にカウンターをロードする必要がありますが、これは単なる推測です。

これがいつか他の誰かに役立つことを願っています!

88
Scott Willeke