예제 #1
0
        /// <summary>
        /// Fires the InvokeCanceled event.
        /// </summary>
        /// <param name="details">Invocation details</param>
        /// <param name="ex">Exception</param>
        private void Invoke_FireInvokeCanceledEvent(InvocationDetails details, Exception ex)
        {
            details.ExceptionThrown = true;

            var args = new InvokeCanceledEventArgs
            {
                TrackingID      = details.TrackingID,
                CancelException = ex
            };

            _host.OnInvokeCanceled(args);

            throw args.CancelException.PreserveStackTrace() ?? new InvokeCanceledException();
        }
예제 #2
0
        /// <summary>
        /// Verarbeitet BeforeInvoke-Abos (falls welche registriert sind).
        /// </summary>
        /// <param name="trackingID">Aufrufschlüssel zur Nachverfolgung</param>
        /// <param name="interfaceName">Name der Komponentenschnittstelle</param>
        /// <param name="delegateCorrelationSet">Korrelationssatz für die Verdrahtung bestimmter Delegaten und Ereignisse mit entfernten Methoden</param>
        /// <param name="methodName">Methodenname</param>
        /// <param name="args">Parameter</param>
        private void ProcessBeforeInvoke(Guid trackingID, ref string interfaceName, ref List <DelegateCorrelationInfo> delegateCorrelationSet, ref string methodName, ref object[] args)
        {
            // Wenn BeforeInvoke-Abos vorhanden sind ...
            if (_host.HasBeforeInvokeSubscriptions())
            {
                // Ereignisargumente für BeforeInvoke erstellen
                BeforeInvokeEventArgs cancelArgs = new BeforeInvokeEventArgs()
                {
                    TrackingID             = trackingID,
                    InterfaceName          = interfaceName,
                    DelegateCorrelationSet = delegateCorrelationSet,
                    MethodName             = methodName,
                    Arguments = args,
                    Cancel    = false
                };
                // BeforeInvoke-Ereignis feuern
                _host.OnBeforeInvoke(cancelArgs);

                // Wenn der Aufruf abgebrochen werden soll ...
                if (cancelArgs.Cancel)
                {
                    // Wenn keine Abbruchausnahme definiert ist ...
                    if (cancelArgs.CancelException == null)
                    {
                        // Standard-Abbruchausnahme erstellen
                        cancelArgs.CancelException = new InvokeCanceledException();
                    }

                    // InvokeCanceled-Ereignis feuern
                    _host.OnInvokeCanceled(new InvokeCanceledEventArgs()
                    {
                        TrackingID = trackingID, CancelException = cancelArgs.CancelException
                    });

                    // Abbruchausnahme werfen
                    throw cancelArgs.CancelException;
                }
                else // Wenn der Aufruf nicht abgebrochen werden soll ...
                {
                    // Einstellungen der Ereignisargumente übernehmen
                    interfaceName          = cancelArgs.InterfaceName;
                    delegateCorrelationSet = cancelArgs.DelegateCorrelationSet;
                    methodName             = cancelArgs.MethodName;
                    args = cancelArgs.Arguments;
                }
            }
        }
예제 #3
0
        /// <summary>
        /// Fires the InvokeCanceled event.
        /// </summary>
        /// <param name="details">Invocation details</param>
        /// <param name="ex">Exception</param>
        private void Invoke_FireInvokeCanceledEvent(InvocationDetails details, Exception ex)
        {
            details.ExceptionThrown = true;

            var args = new InvokeCanceledEventArgs
            {
                TrackingID             = details.TrackingID,
                InterfaceName          = details.InterfaceName,
                DelegateCorrelationSet = details.DelegateCorrelationSet,
                MethodName             = details.MethodName,
                Arguments       = details.Args,
                CancelException = ex
            };

            _host.OnInvokeCanceled(args);

            throw args.CancelException.PreserveStackTrace() ?? new InvokeCanceledException();
        }