public override IMessage Invoke(IMessage myIMessage) { IMethodCallMessage calldata = myIMessage as IMethodCallMessage; object oret = null; string mtdname = myIMessage.Properties["__MethodName"].ToString(); if ((mtdname.StartsWith("add_") || mtdname.StartsWith("remove_")) && calldata.InArgs.Length == 1 && calldata.InArgs[0] is Delegate) { string callname = ""; string arg = ""; string eventname = ""; string callermtdname = ((Delegate)calldata.InArgs[0]).Method.Name; if (mtdname.StartsWith("add_")) { eventname = mtdname.Substring(4); eventmgr.AddEvent(eventname, (Delegate)calldata.InArgs[0]); callname = "add_event"; arg = string.Format("{0}/{1}/{2}", eventname, eventserver.Name, callermtdname); } else if (mtdname.StartsWith("remove_")) { callname = "remove_event"; eventname = mtdname.Substring(7); eventmgr.RemoveEvent(eventname, callermtdname); arg = string.Format("{0}/{1}/{2}", eventname, eventserver.Name, callermtdname); } Exception ex; if (InvokeMember(callname, new object[] { arg }, out oret, out ex)) { return(new ReturnMessage(oret, null, 0, null, null)); } return(new ReturnMessage(ex, calldata)); } object[] newargs = new object[calldata.Args.Length]; Array.Copy(calldata.Args, newargs, calldata.Args.Length); if (callmode == Callmode.sync || !basynccall) { Exception ex; if (!InvokeMember(calldata.MethodName, newargs, out oret, out ex)) { return(new ReturnMessage(ex, calldata)); } } else { APIData apidata = new APIData(); apidata.calldata = calldata; apidata.retargs = newargs; asynccallserver.AddItem(new object[] { apidata }); } return(new ReturnMessage(oret, newargs, newargs.Length, null, null)); }
void InvokeAsync(object apidata) { APIData apicalldata = (APIData)apidata; Exception ex; bool bret = InvokeMember(apicalldata.calldata.MethodName, apicalldata.retargs, out apicalldata.retval, out ex); if (basynccallback || callback != null) { callbackserver.DoAction = callback; callbackserver.AddItem((bret)?(new object[] { apicalldata }):new object[] { ex }); } }