2013-09-27 5 views
1

Я хочу, чтобы получить Provider Event Guid на основе событий Имя поставщика (Ex: Sample-Test)ETW Поставщик Guid на основе имен .Net 4.0

Пример кода

[EventSource(Name = "Sample-Test")] 
public sealed class EventSourceLogger : EventSource 

Вот мой провайдер

internal class EventProviderVersionOne : EventProvider 
{ 
    internal EventProviderVersionOne(Guid id) 
     : base(id) 
    { } 

    [StructLayout(LayoutKind.Explicit, Size = 16)] 
    private struct EventData 
    { 
     [FieldOffset(0)] 
     internal UInt64 DataPointer; 
     [FieldOffset(8)] 
     internal uint Size; 
     [FieldOffset(12)] 
     internal int Reserved; 
    } 

} 

Мой класс регистратор для регистрации событий

public class EventLogger 
{ 
    public static EventLogger Log = new EventLogger(); 

    internal static EventProviderVersionOne MProvider = new EventProviderVersionOne(new Guid(ConfigurationSettings.AppSettings["EtwEventProviderGuid"])); 

    ... 
} 

Пожалуйста, представьте код, необходимый для получения GUID на основе EventSourceName. Я уже зарегистрировался в Eventvwr.

ответ

0

Я использовал PerfView для получения GUID. Начните захват, включите провайдера, которому вы хотите узнать GUID, запустите регистрацию, перейдите к записи «log», и здесь вы увидите GUID.

При регистрации Провайдера в системе вы можете использовать xperf -providers, чтобы увидеть GUID.

0

Следующие по-видимому, алгоритм в менее запутанной форме:

public static byte[] Concat(byte[] a, byte[] b) 
    { 
     byte[] retval = new byte[a.Length + b.Length]; 
     a.CopyTo(retval, 0); 
     b.CopyTo(retval, a.Length); 
     return retval; 
    } 

    public static byte[] Slice(byte[] a, int startIndex, int length) 
    { 
     byte[] retval = new byte[length]; 
     Array.Copy(a, startIndex, retval, 0, length); 
     return retval; 
    } 

    private static Guid GenerateGuidFromName(string name) 
    { 
     byte[] namespaceGuid = Guid.Parse("b22d2c48-90c3-c847-87f8-1a15bfc130fb").ToByteArray(); 
     byte[] nameBytes = Encoding.BigEndianUnicode.GetBytes(name); 
     byte[] sha1Hash = SHA1.Create().ComputeHash(Concat(namespaceGuid, nameBytes)); 
     byte[] guidBytes = Slice(sha1Hash, 0, 16); 
     // Overwrite the top 4 bits of the 8th byte with 0101 
     { 
      guidBytes[7] &= 0x0F; 
      guidBytes[7] |= 0x50; 
     } 
     return new Guid(guidBytes); 
    } 
+1

Но не забудьте сделать ToUpperInvariant() первым .... – paullem

Смежные вопросы