public void SetSenderFactory <TSender>(Func <IReadOnlyConfiguration, ErrorCallback, TSender> createSender) where TSender : ISender { sender_create_fn create_fn = (IntPtr configuration, error_fn error_callback, IntPtr error_context) => { ErrorCallback errorCallback = new ErrorCallback(error_callback, error_context); Configuration readableConfig = new Configuration(configuration); TSender sender = createSender((IReadOnlyConfiguration)readableConfig, errorCallback); SenderAdapter adapter = new SenderAdapter(sender); // Unpinning this happens inside of SenderAdapter when Release is invoked GCHandle adapterHandle = GCHandle.Alloc(adapter); return(GCHandle.ToIntPtr(adapterHandle)); }; GCHandleLifetime localCreateHandle = new GCHandleLifetime(create_fn, GCHandleType.Normal); SetFactoryContextBindingSenderFactory(this.DangerousGetHandle(), create_fn, SenderAdapter.VTable); Interlocked.Exchange(ref this.registeredSenderCreateHandle, localCreateHandle); // GCHandleLifetime cleans itself up, and does not need to be explicitly .Dispose()d. }
private static extern IntPtr SetFactoryContextBindingSenderFactory(IntPtr context, sender_create_fn create_Fn, sender_vtable vtable);