Example #1
0
        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.
        }
Example #2
0
 private static extern IntPtr SetFactoryContextBindingSenderFactory(IntPtr context, sender_create_fn create_Fn, sender_vtable vtable);