/// <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; } }
/// <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; } } }