/// <summary>
        /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
        /// </summary>
        protected override void Dispose(bool disposing)
        {
            base.Dispose(disposing);

            if (disposing)
            {
                _pendingCallbacks.Dispose();

                if (_pluginContext != null)
                {
                    _pluginContext.Dispose();
                }
                lock (_contexts)
                {
                    foreach (var context in _contexts.Values)
                    {
                        context.Dispose();
                    }

                    _contexts.Clear();
                }
            }
        }