EventSource.WriteEventCore(Int32, Int32, EventSource+EventData*) メソッド

定義

重要

この API は CLS 準拠ではありません。

指定したイベント識別子およびイベント データを使用して、WriteEvent の新しいオーバーロードを作成します。Creates a new WriteEvent overload by using the provided event identifier and event data.

protected:
 void WriteEventCore(int eventId, int eventDataCount, System::Diagnostics::Tracing::EventSource::EventData* data);
protected void WriteEventCore (int eventId, int eventDataCount, System.Diagnostics.Tracing.EventSource.EventData* data);
[System.CLSCompliant(false)]
protected void WriteEventCore (int eventId, int eventDataCount, System.Diagnostics.Tracing.EventSource.EventData* data);
[System.CLSCompliant(false)]
[System.Security.SecurityCritical]
protected void WriteEventCore (int eventId, int eventDataCount, System.Diagnostics.Tracing.EventSource.EventData* data);
member this.WriteEventCore : int * int * nativeptr<System.Diagnostics.Tracing.EventSource.EventData> -> unit
[<System.CLSCompliant(false)>]
member this.WriteEventCore : int * int * nativeptr<System.Diagnostics.Tracing.EventSource.EventData> -> unit
[<System.CLSCompliant(false)>]
[<System.Security.SecurityCritical>]
member this.WriteEventCore : int * int * nativeptr<System.Diagnostics.Tracing.EventSource.EventData> -> unit

パラメーター

eventId
Int32

イベント識別子。The event identifier.

eventDataCount
Int32

イベント データ項目数。The number of event data items.

data
EventSource.EventData

イベント データを格納している構造体。The structure that contains the event data.

属性

注釈

eventid should be greater than 0 or less than 65535 or errors can occur in the operation. エラーが発生した場合は、デバッガーの出力ストリームを調べて、エラーの原因に関する詳細情報を取得できます。デバッガーがプロセスの実行イベントにアタッチされている場合は、If errors do occur, you can get more information about the source of the error by checking the output stream of the debugger, if you have a debugger attached to the process firing events. また、エラーが発生したイベントソースに ETW リスナーがある場合は、ETW イベントストリームで報告されたエラーを検索することもできます。You can also look for errors reported in the ETW event stream, if you have an ETW listener on the event source where the error occurs.

この保護されたメソッドを使用すると、ユーザーは WriteEvent 、指定されたオーバーロードよりも高速な新しいオーバーロードを定義できます。This protected method enables users to define new WriteEvent overloads that are faster than the provided overloads. 新しいオーバーロードの作成には、アンセーフコードが含まれます。Creating a new overload involves unsafe code. 基本的な手順では、ペイロード項目の数に一致するイベントデータ記述子の配列をスタック割り当てします。The basic procedure is to stack-allocate an array of event data descriptors that matches the number of payload items. 各ペイロード項目について、イベントデータ配列に正しいサイズと値を設定します。 WriteEventCore 初期化された配列を使用してを呼び出します。For each payload item, set the correct size and value in the event data array.Call WriteEventCore with the initialized array.

次の例は、4つの引数を受け取るオーバーロードを追加する方法を示して WriteEvent います。The following example shows how to add a WriteEvent overload that accepts four arguments. たとえば、1つの文字列と3つの整数をログに記録するログ記録イベントがあるとします。An example would be if you have a logging event that logs a string and 3 integers.

[Event(1)]  
public void LogTime(string tag, int hour, int minute, int second)   
{  
    WriteEvent(1, tag, hour, minute, second);  
}  

これは、を呼び出さなくても実行でき WriteEventCore ますが、それほど遅くなることはありません。You could do this without calling WriteEventCore, but it would be slower than it needs to be. これは、配列とリフレクションを使用して何を行うかを判断するためです。That is because it uses arrays and reflection to figure out what to do. これらを高速度 (> 1000/秒) でログに記録する場合は、次の例に示すように、高速のヘルパーを作成する価値があります。If you log these at a high rate (> 1000 / sec), it can be worth making a fast helper, as shown in the following example. メソッドは、既存のをシャドウし WriteEvent ます。The method shadows the existing WriteEvent. このため、元の呼び出し元コード (LogTime) は実際には変更されませんが、C# コンパイラはより専門的なバージョンを使用しますが、これはより高速になります。Thus the original caller code (LogTime) does not actually change, but the C# compiler will use the more specialized version which will be faster.

アンセーフコードをコンパイルするには、 /unsafe (C# コンパイラオプション) コンパイラオプションを指定する必要があります。To compile unsafe code, you must specify the /unsafe (C# Compiler Options) compiler option.

class AnotherEventSource : EventSource {  

    [NonEvent]  
    public unsafe void WriteEvent(int eventId, string arg1, int arg2, int arg3, int arg4)  
    {  

        fixed (char* arg1Ptr = arg1)  
        {  
            EventData* dataDesc = stackalloc EventData[4];  

            dataDesc[0].DataPointer = (IntPtr)arg1Ptr;  
            dataDesc[0].Size = (arg1.Length + 1) * 2; // Size in bytes, including a null terminator.   
            dataDesc[1].DataPointer = (IntPtr)(&arg2);  
            dataDesc[1].Size = 4;  
            dataDesc[2].DataPointer = (IntPtr)(&arg3);  
            dataDesc[2].Size = 4;  
            dataDesc[3].DataPointer = (IntPtr)(&arg4);  
            dataDesc[3].Size = 4;  

            WriteEventCore(eventId, 4, dataDesc);  
        }  
    }  
}  

適用対象