protected virtual void CoreInvoke(IRuntimeInvocation runtimeInvocation, IRuntimeContext runtimeContext)
        {
            Exception thrownException = null;
            bool      proceedWithInvocation;

            if ((object)runtimeInvocation == null)
            {
                throw new ArgumentNullException(nameof(runtimeInvocation));
            }

            if ((object)runtimeContext == null)
            {
                throw new ArgumentNullException(nameof(runtimeContext));
            }

            if (!((object)runtimeInvocation.TargetMethod != null &&
                  runtimeInvocation.TargetMethod.DeclaringType == typeof(IDisposable)) &&
                this.IsDisposed)                 // always forward dispose invocations
            {
                throw new ObjectDisposedException(typeof(RuntimeInterception).FullName);
            }

            this.CoreBeforeInvoke(runtimeInvocation, out proceedWithInvocation);

            if (proceedWithInvocation)
            {
                this.CoreProceedInvoke(runtimeInvocation, out thrownException);
            }

            this.CoreAfterInvoke(proceedWithInvocation, runtimeInvocation, ref thrownException);

            if ((object)thrownException != null)
            {
                runtimeContext.AbortInterceptionChain();
                throw thrownException;
            }
        }