EventSource.WriteEventCore(Int32, Int32, EventSource+EventData*) Methode
Definitie
Belangrijk
Bepaalde informatie heeft betrekking op een voorlopige productversie die aanzienlijk kan worden gewijzigd voordat deze wordt uitgebracht. Microsoft biedt geen enkele expliciete of impliciete garanties met betrekking tot de informatie die hier wordt verstrekt.
Belangrijk
Deze API is niet CLS-conform.
Hiermee maakt u een nieuwe WriteEvent overbelasting met behulp van de opgegeven gebeurtenis-id en gebeurtenisgegevens.
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);
[System.CLSCompliant(false)]
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("EventSource will serialize the whole object graph. Trimmer will not safely handle this case because properties may be trimmed. This can be suppressed if the object is a primitive type")]
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>]
member this.WriteEventCore : int * int * nativeptr<System.Diagnostics.Tracing.EventSource.EventData> -> unit
[<System.CLSCompliant(false)>]
[<System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("EventSource will serialize the whole object graph. Trimmer will not safely handle this case because properties may be trimmed. This can be suppressed if the object is a primitive type")>]
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
Parameters
- eventId
- Int32
De gebeurtenis-id.
- eventDataCount
- Int32
Het aantal gebeurtenisgegevensitems.
De structuur die de gebeurtenisgegevens bevat.
- Kenmerken
Opmerkingen
eventid moet groter zijn dan 0 of kleiner dan 65535 of fouten kunnen optreden in de bewerking. Als er fouten optreden, kunt u meer informatie krijgen over de bron van de fout door de uitvoerstroom van het foutopsporingsprogramma te controleren als er een foutopsporingsprogramma is gekoppeld aan de gebeurtenissen voor het activeren van processen. U kunt ook zoeken naar fouten die zijn gerapporteerd in de ETW-gebeurtenisstroom als u een ETW-listener hebt op de gebeurtenisbron waar de fout optreedt.
Met deze beveiligde methode kunnen gebruikers nieuwe WriteEvent overbelastingen definiëren die sneller zijn dan de opgegeven overbelastingen. Het maken van een nieuwe overbelasting omvat onveilige code. De basisprocedure is het stapelen van een matrix met gebeurtenisgegevensdescriptors die overeenkomen met het aantal nettoladingitems. Stel voor elk nettoladingitem de juiste grootte en waarde in de matrix met gebeurtenisgegevens in. Aanroepen WriteEventCore met de geïnitialiseerde matrix.
In het volgende voorbeeld ziet u hoe u een WriteEvent overbelasting toevoegt die vier argumenten accepteert. Een voorbeeld hiervan is als u een logboekregistratie-gebeurtenis hebt die een tekenreeks en drie gehele getallen registreert.
[Event(1)]
public void LogTime(string tag, int hour, int minute, int second)
{
WriteEvent(1, tag, hour, minute, second);
}
U kunt dit doen zonder te bellen WriteEventCore, maar het zou langzamer zijn dan nodig is. Dat komt doordat het matrices en reflectie gebruikt om erachter te komen wat u moet doen. Als u deze met een hoge snelheid (> 1000 per seconde) aanmeldt, kan het de moeite waard zijn om een snelle helper te maken, zoals wordt weergegeven in het volgende voorbeeld. De methode schaduwt de bestaande WriteEvent. De oorspronkelijke aanroepercode (LogTime) wordt dus niet daadwerkelijk gewijzigd, maar de C#-compiler gebruikt de meer gespecialiseerde versie die sneller zal zijn.
Als u onveilige code wilt compileren, moet u de compileroptie /onveilig (C#-compileropties) opgeven.
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);
}
}
}
Dit zijn de verwachte grootten en gegevenscoderingen voor standaard serialiseerbare typen:
// bool arg
int temp = arg ? 1 : 0;
desc.DataPointer = (IntPtr)(&temp);
desc.Size = 4;
// byte arg
desc.DataPointer = (IntPtr)(&arg);
desc.Size = 1;
// sbyte arg
desc.DataPointer = (IntPtr)(&arg);
desc.Size = 1;
// char arg
desc.DataPointer = (IntPtr)(&arg);
desc.Size = 2;
// short arg
desc.DataPointer = (IntPtr)(&arg);
desc.Size = 2;
// ushort arg
desc.DataPointer = (IntPtr)(&arg);
desc.Size = 2;
// int arg
desc.DataPointer = (IntPtr)(&arg);
desc.Size = 4;
// uint arg
desc.DataPointer = (IntPtr)(&arg);
desc.Size = 4;
// long arg
desc.DataPointer = (IntPtr)(&arg);
desc.Size = 8;
// ulong arg
desc.DataPointer = (IntPtr)(&arg);
desc.Size = 8;
// float arg
desc.DataPointer = (IntPtr)(&arg);
desc.Size = 4;
// double arg
desc.DataPointer = (IntPtr)(&arg);
desc.Size = 8;
// decimal arg
desc.DataPointer = (IntPtr)(&arg);
desc.Size = 16;
// Guid arg
desc.DataPointer = (IntPtr)(&arg);
desc.Size = 16;
// IntPtr arg
desc.DataPointer = (IntPtr)(&arg);
desc.Size = IntPtr.Size;
// UIntPtr arg
desc.DataPointer = (IntPtr)(&arg);
desc.Size = UIntPtr.Size;
// DateTime arg
long fileTime = arg.ToUniversalTime() > new DateTime(1601, 1, 1) ? arg.ToFileTimeUtc() : 0;
desc.DataPointer = (IntPtr)(&fileTime);
desc.Size = 8;
// string arg
fixed(char* ptr = arg)
{
desc.DataPointer = (IntPtr)ptr;
// strings use 2 byte per char UTF16 encoding and a null terminator at the end
// only strings without embedded null characters are supported
desc.Size = (arg.Length + 1) * 2;
}
// byte[] arg
// This one is encoded using two adjacent EventData elements.
fixed(byte* ptr = arg)
{
int length = arg.Length;
desc[i].DataPointer = (IntPtr)(&length);
desc[i].Size = 4;
desc[i + 1].DataPointer = (IntPtr)ptr;
desc[i + 1].Size = arg.Length;
}
// enums should be converted to their underlying type and then serialized
// as byte, short, or int.