EventSource.WriteEventCore(Int32, Int32, EventSource+EventData*) EventSource.WriteEventCore(Int32, Int32, EventSource+EventData*) EventSource.WriteEventCore(Int32, Int32, EventSource+EventData*) Method

定義

重要

この 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);
[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

パラメーター

eventId
Int32 Int32 Int32

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

eventDataCount
Int32 Int32 Int32

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

data
EventSource.EventData*

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

注釈

eventid 0 または 65535 より小さいよりも大きい必要があります。 または操作でエラーが発生します。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.

次の例は、追加する方法を示します、WriteEventを 4 つの引数を受け入れるオーバー ロードします。The following example shows how to add a WriteEvent overload that accepts four arguments. 例は、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. したがって、元の呼び出し元コード (現地) は実際には変更されませんが、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);  
        }  
    }  
}  

セキュリティ

SecurityCriticalAttribute
直前の呼び出し元に対する完全な信頼が必要です。requires full trust for the immediate caller. このメンバーは、部分的に信頼されたまたは透過的なコードで使用することはできません。This member cannot be used by partially trusted or transparent code.

適用対象