internal static unsafe ulong Enable( string?outputFile, EventPipeSerializationFormat format, uint circularBufferSizeInMB, EventPipeProviderConfiguration[] providers) { Span <EventPipeProviderConfigurationNative> providersNative = new Span <EventPipeProviderConfigurationNative>((void *)Marshal.AllocCoTaskMem(sizeof(EventPipeProviderConfigurationNative) * providers.Length), providers.Length); providersNative.Clear(); try { for (int i = 0; i < providers.Length; i++) { EventPipeProviderConfigurationNative.MarshalToNative(providers[i], ref providersNative[i]); } fixed(char *outputFilePath = outputFile) fixed(EventPipeProviderConfigurationNative * providersNativePointer = providersNative) { return(Enable(outputFilePath, format, circularBufferSizeInMB, providersNativePointer, (uint)providersNative.Length)); } } finally { for (int i = 0; i < providers.Length; i++) { providersNative[i].Release(); } fixed(EventPipeProviderConfigurationNative *providersNativePointer = providersNative) { Marshal.FreeCoTaskMem((IntPtr)providersNativePointer); } } }
internal static void MarshalToNative(EventPipeProviderConfiguration managed, ref EventPipeProviderConfigurationNative native) { native.m_pProviderName = (char *)Marshal.StringToCoTaskMemUni(managed.ProviderName); native.m_keywords = managed.Keywords; native.m_loggingLevel = managed.LoggingLevel; native.m_pFilterData = (char *)Marshal.StringToCoTaskMemUni(managed.FilterData); }