@@ -139,6 +139,14 @@ public static bool Init(SentryOptions options)
139139 }
140140 }
141141
142+ unsafe
143+ {
144+ var cTransport = sentry_transport_new ( & nativeTransport ) ;
145+ sentry_transport_set_state ( cTransport , GCHandle . ToIntPtr ( GCHandle . Alloc ( options ) ) ) ;
146+ sentry_transport_set_free_func ( cTransport , & nativeTransportFree ) ;
147+ sentry_options_set_transport ( cOptions , cTransport ) ;
148+ }
149+
142150 options . DiagnosticLogger ? . LogDebug ( "Initializing sentry native" ) ;
143151 return 0 == sentry_init ( cOptions ) ;
144152 }
@@ -364,6 +372,61 @@ internal struct sentry_value_t
364372 [ DllImport ( "sentry-native" ) ]
365373 private static extern void sentry_options_set_auto_session_tracking ( IntPtr options , int debug ) ;
366374
375+ [ DllImport ( "sentry-native" ) ]
376+ private static extern void sentry_options_set_transport ( IntPtr options , IntPtr transport ) ;
377+
378+ [ DllImport ( "sentry-native" ) ]
379+ private static extern unsafe IntPtr sentry_transport_new ( delegate * unmanaged/*[Cdecl]*/ < IntPtr , IntPtr , void > sendFunc ) ;
380+
381+ [ DllImport ( "sentry-native" ) ]
382+ private static extern void sentry_transport_set_state ( IntPtr transport , IntPtr state ) ;
383+
384+ [ DllImport ( "sentry-native" ) ]
385+ private static extern unsafe void sentry_transport_set_free_func ( IntPtr transport , delegate * unmanaged/*[Cdecl]*/ < IntPtr , void > freeFunc ) ;
386+
387+ [ DllImport ( "sentry-native" ) ]
388+ private static extern IntPtr sentry_envelope_serialize ( IntPtr envelope , out UIntPtr sizeOut ) ;
389+
390+ [ DllImport ( "sentry-native" ) ]
391+ private static extern void sentry_envelope_free ( IntPtr envelope ) ;
392+
393+ [ DllImport ( "sentry-native" ) ]
394+ private static extern void sentry_free ( IntPtr ptr ) ;
395+
396+ [ UnmanagedCallersOnly ]
397+ private static void nativeTransport ( IntPtr envelope , IntPtr state )
398+ {
399+ try
400+ {
401+ var options = GCHandle . FromIntPtr ( state ) . Target as SentryOptions ;
402+ if ( options is not null )
403+ {
404+ var data = sentry_envelope_serialize ( envelope , out var size ) ;
405+ var content = new StringContent ( Marshal . PtrToStringAnsi ( data , ( int ) size ) ) ;
406+ sentry_free ( data ) ;
407+
408+ using var client = options . GetHttpClient ( ) ;
409+ using var request = options . CreateHttpRequest ( content ) ;
410+ client . SendAsync ( request ) . GetAwaiter ( ) . GetResult ( ) ;
411+ }
412+ }
413+ catch
414+ {
415+ // never allow an exception back to native code - it would crash the app
416+ }
417+ finally
418+ {
419+ sentry_envelope_free ( envelope ) ;
420+ }
421+ }
422+
423+ [ UnmanagedCallersOnly ]
424+ private static void nativeTransportFree ( IntPtr state )
425+ {
426+ var handle = GCHandle . FromIntPtr ( state ) ;
427+ handle . Free ( ) ;
428+ }
429+
367430 [ DllImport ( "sentry-native" ) ]
368431 private static extern unsafe void sentry_options_set_logger ( IntPtr options , delegate * unmanaged/*[Cdecl]*/ < int , IntPtr , IntPtr , IntPtr , void > logger , IntPtr userData ) ;
369432
0 commit comments