예제 #1
0
        /// <summary>
        /// Processes BeforeInvoke event subscriptions (if there any).
        /// </summary>
        /// <param name="details">Invocation details</param>
        private void ProcessBeforeInvoke(InvocationDetails details)
        {
            if (_host.HasBeforeInvokeSubscriptions())
            {
                BeforeInvokeEventArgs cancelArgs = new BeforeInvokeEventArgs()
                {
                    TrackingID             = details.TrackingID,
                    InterfaceName          = details.InterfaceName,
                    DelegateCorrelationSet = details.DelegateCorrelationSet,
                    MethodName             = details.MethodName,
                    Arguments = details.Args,
                    Cancel    = false
                };
                _host.OnBeforeInvoke(cancelArgs);

                if (cancelArgs.Cancel)
                {
                    if (cancelArgs.CancelException == null)
                    {
                        cancelArgs.CancelException = new InvokeCanceledException();
                    }

                    throw cancelArgs.CancelException.PreserveStackTrace();
                }

                details.InterfaceName          = cancelArgs.InterfaceName;
                details.DelegateCorrelationSet = cancelArgs.DelegateCorrelationSet;
                details.MethodName             = cancelArgs.MethodName;
                details.Args = cancelArgs.Arguments;
            }
        }
예제 #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;
                }
            }
        }