2011-10-03 4 views
7

こんにちは、perfmonで使用するカスタムパフォーマンスカウンタを作成しようとしています。次のコードはうまくいきますが、問題は1つあります。カスタムパフォーマンスカウンタin c#/ perfmon

このソリューションでは、パフォーマンスカウンタの値を更新するタイマーがありますが、この実行可能ファイルを実行して必要なデータを取得する必要はありません。それは私がちょうど1つのものとしてカウンタをインストールし、データのためのperfmonクエリを持っているようにしたいと思います(すべてのプリインストールされたカウンターと同様)。

どうすればこの問題を解決できますか? Win32では

using System; 
using System.Diagnostics; 
using System.Net.NetworkInformation; 

namespace PerfCounter 
{ 
class PerfCounter 
{ 
    private const String categoryName = "Custom category"; 
    private const String counterName = "Total bytes received"; 
    private const String categoryHelp = "A category for custom performance counters"; 
    private const String counterHelp = "Total bytes received on network interface"; 
    private const String lanName = "Local Area Connection"; // change this to match your network connection 
    private const int sampleRateInMillis = 1000; 
    private const int numberofSamples = 100; 

    private static NetworkInterface lan = null; 
    private static PerformanceCounter perfCounter; 

    static void Main(string[] args) 
    { 
     setupLAN(); 
     setupCategory(); 
     createCounters(); 
     updatePerfCounters(); 
    } 

    private static void setupCategory() 
    { 
     if (!PerformanceCounterCategory.Exists(categoryName)) 
     { 
      CounterCreationDataCollection counterCreationDataCollection = new CounterCreationDataCollection(); 
      CounterCreationData totalBytesReceived = new CounterCreationData(); 
      totalBytesReceived.CounterType = PerformanceCounterType.NumberOfItems64; 
      totalBytesReceived.CounterName = counterName; 
      counterCreationDataCollection.Add(totalBytesReceived); 
      PerformanceCounterCategory.Create(categoryName, categoryHelp, PerformanceCounterCategoryType.MultiInstance, counterCreationDataCollection); 
     } 
     else 
      Console.WriteLine("Category {0} exists", categoryName); 
    } 

    private static void createCounters() { 
     perfCounter = new PerformanceCounter(categoryName, counterName, false); 
     perfCounter.RawValue = getTotalBytesReceived(); 
    } 

    private static long getTotalBytesReceived() 
    { 
     return lan.GetIPv4Statistics().BytesReceived; 
    } 

    private static void setupLAN() 
    { 
     NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces(); 
     foreach (NetworkInterface networkInterface in interfaces) 
     { 
      if (networkInterface.Name.Equals(lanName)) 
       lan = networkInterface; 
     } 
    } 
    private static void updatePerfCounters() 
    { 
     for (int i = 0; i < numberofSamples; i++) 
     { 
      perfCounter.RawValue = getTotalBytesReceived(); 
      Console.WriteLine("perfCounter.RawValue = {0}", perfCounter.RawValue); 
      System.Threading.Thread.Sleep(sampleRateInMillis); 
     } 
    } 
} 

}

答えて

6

、パフォーマンスカウンタは、パフォーマンスモニタにカウンタ値を提供するDLLをロード有することによって働きます。

.NETでは、このDLLは共有メモリを使用して実行中の.NETプロセスと通信するスタブです。プロセスは定期的に新しい値を共有メモリブロックにプッシュし、DLLによってパフォーマンスカウンタとして使用できるようになります。

基本的に、パフォーマンスカウンタDLLはネイティブコードで実装する必要があります。これは、.NETパフォーマンスカウンタではプロセスが実行されていると想定されるためです。