static void OnLogInternal(IntPtr data, LogLevel level, IntPtr ctx, IntPtr format, IntPtr args) { if (_log == null) { return; } IntPtr buffer = IntPtr.Zero; try { buffer = Marshal.AllocHGlobal(2048 + 1); var count = MarshalUtils.vsprintf(buffer, format, args); if (count > -1) { var message = buffer.FromUtf8(); GetLogContext(ctx, out var module, out var file, out var line); #if NET40 Task.Factory.StartNew(() => _log?.Invoke(null, new LogEventArgs(level, message, module, file, line))); #else Task.Run(() => _log?.Invoke(null, new LogEventArgs(level, message, module, file, line))); #endif } } finally { if (buffer != IntPtr.Zero) { Marshal.FreeHGlobal(buffer); } } }