public void SendMessage(string handler, IList arguments) { BeginUpdate(); try { _so.SendMessage(handler, arguments); } finally { EndUpdate(); } // Invoke method on registered handler string serviceName, serviceMethod; int dotPos = handler.LastIndexOf("."); if (dotPos != -1) { serviceName = handler.Substring(0, dotPos); serviceMethod = handler.Substring(dotPos + 1); } else { serviceName = string.Empty; serviceMethod = handler; } object soHandler = GetServiceHandler(serviceName); if (soHandler == null && this.HasParent) { // No custom handler, check for service defined in the scope's context IScopeContext context = this.Parent.Context; try { //Search for a handler only if there is a service name specified if (serviceName != string.Empty) { // The type must have a name of "SharedObjectName.DottedServiceName" soHandler = ObjectFactory.CreateInstance(_so.Name + "." + serviceName); } } catch (Exception) { // No such type. log.Debug(__Res.GetString(__Res.Type_InitError, _so.Name + "." + serviceName)); } } if (soHandler != null) { MethodInfo mi = MethodHandler.GetMethod(soHandler.GetType(), serviceMethod, arguments); if (mi != null) { ParameterInfo[] parameterInfos = mi.GetParameters(); object[] args = new object[parameterInfos.Length]; arguments.CopyTo(args, 0); TypeHelper.NarrowValues(args, parameterInfos); try { InvocationHandler invocationHandler = new InvocationHandler(mi); object result = invocationHandler.Invoke(soHandler, args); } catch (Exception exception) { log.Error(__Res.GetString(__Res.ServiceHandler_InvocationFailed, serviceMethod, handler), exception); } } } // Notify server listeners foreach (ISharedObjectListener listener in _serverListeners) { listener.OnSharedObjectSend(this, handler, arguments); } }