/// <include file='InterfaceDocumentationComments.xml' path='doc/members/member[@name="M:MethodInvocationRemoting.IMethodInvocationRemoteSender.InvokeMethod(MethodInvocationRemoting.IMethodInvocation)"]/*'/> public object InvokeMethod(IMethodInvocation inputMethodInvocation) { metricsUtilities.Begin(new RemoteMethodSendTime()); object returnValue; try { // Check that inputted method invocation does not have a void return type. if (inputMethodInvocation.ReturnType == null) { throw new ArgumentException("Method invocation cannot have a void return type.", "inputMethodInvocation"); } string serializedReturnValue = SerializeAndSend(inputMethodInvocation); try { returnValue = serializer.DeserializeReturnValue(serializedReturnValue); } catch (Exception e) { throw new Exception("Failed to deserialize return value.", e); } } catch (Exception e) { metricsUtilities.CancelBegin(new RemoteMethodSendTime()); throw; } metricsUtilities.End(new RemoteMethodSendTime()); metricsUtilities.Increment(new RemoteMethodSent()); loggingUtilities.Log(this, LogLevel.Information, "Invoked method '" + inputMethodInvocation.Name + "'."); return(returnValue); }