public override IMessage Invoke(IMessage msg) { Monitor.Enter(this); try { var _msg = msg as IMethodCallMessage; try { var _args = new object[_msg.ArgCount]; for (int i = 0; i < _msg.ArgCount; i++) { _args[i] = _msg.Args[i]; } if (_msg.MethodBase.IsSpecialName) { var _name = _msg.MethodBase.Name.Split(new string[] { "_" }, 2, StringSplitOptions.None); var _eventName = _name[1]; switch (_name[0]) { case "add": if (this._events.ContainsKey(_eventName)) { var _isExist = this._events[_eventName].Handler != null; this._events[_eventName].AddHandler(_args[0] as Delegate); if (_isExist) { return(new ReturnMessage(null, _args, 0, _msg.LogicalCallContext, _msg)); } } else { this._events.Add(_eventName, EventHandlerHelper.Create(_eventName, _args[0] as Delegate, this.Helper)); } _args[0] = this._events[_eventName].ProxyHandler; break; case "remove": if (this._events.ContainsKey(_eventName)) { this._events[_eventName].RemoveHandler(_args[0] as Delegate); if (this._events[_eventName].Handler != null) { return(new ReturnMessage(null, _args, 0, _msg.LogicalCallContext, _msg)); } _args[0] = this._events[_eventName].ProxyHandler; } break; } } var _result = this.Helper.InvokeHandler(this._instance, _msg.MethodBase, _args); return(new ReturnMessage(_result, _args, 0, _msg.LogicalCallContext, _msg)); } catch (Exception ex) { return(new ReturnMessage(ex, _msg)); } } finally { Monitor.Exit(this); } }