public object Invoke(object proxy, string methodName, Type[] paramTypes, Type returnType, object[] attrs, object[] args) { #endif HproseResultMode resultMode = HproseResultMode.Normal; bool simple = false; bool byRef = false; #if !dotNETMF foreach (Type param in paramTypes) { if (param.IsByRef) { byRef = true; break; } } #endif foreach (object attr in attrs) { if (attr is ResultModeAttribute) { resultMode = (attr as ResultModeAttribute).Value; } else if (attr is SimpleModeAttribute) { simple = (attr as SimpleModeAttribute).Value; } else if (attr is ByRefAttribute) { byRef = (attr as ByRefAttribute).Value; } else if (attr is MethodNameAttribute) { methodName = (attr as MethodNameAttribute).Value; } } CheckResultType(resultMode, returnType); if (ns != null && ns != "") { methodName = ns + '_' + methodName; } #if (dotNET4 || SL5 || WP80) && !(SL4 || WP70 || WP71) #if Core if (returnType.GetTypeInfo().IsGenericType&& returnType.GetGenericTypeDefinition() == typeof(Task <>)) { ITaskCreator taskCreator = Activator.CreateInstance(typeof(TaskCreator <>).MakeGenericType(returnType.GenericTypeArguments)) as ITaskCreator; #else if (returnType.IsGenericType && returnType.GetGenericTypeDefinition() == typeof(Task <>)) { ITaskCreator taskCreator = Activator.CreateInstance(typeof(TaskCreator <>).MakeGenericType(returnType.GetGenericArguments())) as ITaskCreator; #endif return(taskCreator.GetTask(invoker, methodName, args, byRef, resultMode, simple)); } if (returnType == typeof(Task)) { #if dotNET45 return(Task.Run(delegate() { invoker.Invoke(methodName, args, (Type)null, byRef, resultMode, simple); })); #else return(Task.Factory.StartNew(delegate() { invoker.Invoke(methodName, args, (Type)null, byRef, resultMode, simple); }, default(CancellationToken), TaskCreationOptions.None, TaskScheduler.Default)); #endif } #endif int n = paramTypes.Length; if ((n > 0) && (paramTypes[n - 1] == typeof(HproseCallback))) { HproseCallback callback = (HproseCallback)args[n - 1]; object[] tmpargs = new object[n - 1]; Array.Copy(args, 0, tmpargs, 0, n - 1); invoker.Invoke(methodName, tmpargs, callback, byRef, resultMode, simple); return(null); } if ((n > 0) && (paramTypes[n - 1] == typeof(HproseCallback1))) { HproseCallback1 callback = (HproseCallback1)args[n - 1]; object[] tmpargs = new object[n - 1]; Array.Copy(args, 0, tmpargs, 0, n - 1); invoker.Invoke(methodName, tmpargs, callback); return(null); } if ((n > 1) && (paramTypes[n - 2] == typeof(HproseCallback)) && (paramTypes[n - 1] == typeof(Type))) { HproseCallback callback = (HproseCallback)args[n - 2]; returnType = (Type)args[n - 1]; CheckResultType(resultMode, returnType); object[] tmpargs = new object[n - 2]; Array.Copy(args, 0, tmpargs, 0, n - 2); invoker.Invoke(methodName, tmpargs, callback, returnType, byRef, resultMode, simple); return(null); } if ((n > 1) && (paramTypes[n - 2] == typeof(HproseCallback1)) && (paramTypes[n - 1] == typeof(Type))) { HproseCallback1 callback = (HproseCallback1)args[n - 2]; returnType = (Type)args[n - 1]; CheckResultType(resultMode, returnType); object[] tmpargs = new object[n - 2]; Array.Copy(args, 0, tmpargs, 0, n - 2); invoker.Invoke(methodName, tmpargs, callback, returnType, resultMode, simple); return(null); } if ((n > 2) && (paramTypes[n - 3] == typeof(HproseCallback)) && (paramTypes[n - 2] == typeof(HproseErrorEvent)) && (paramTypes[n - 1] == typeof(Type))) { HproseCallback callback = (HproseCallback)args[n - 3]; HproseErrorEvent errorEvent = (HproseErrorEvent)args[n - 2]; returnType = (Type)args[n - 1]; CheckResultType(resultMode, returnType); object[] tmpargs = new object[n - 3]; Array.Copy(args, 0, tmpargs, 0, n - 3); invoker.Invoke(methodName, tmpargs, callback, errorEvent, returnType, byRef, resultMode, simple); return(null); } if ((n > 2) && (paramTypes[n - 3] == typeof(HproseCallback1)) && (paramTypes[n - 2] == typeof(HproseErrorEvent)) && (paramTypes[n - 1] == typeof(Type))) { HproseCallback1 callback = (HproseCallback1)args[n - 3]; HproseErrorEvent errorEvent = (HproseErrorEvent)args[n - 2]; returnType = (Type)args[n - 1]; CheckResultType(resultMode, returnType); object[] tmpargs = new object[n - 3]; Array.Copy(args, 0, tmpargs, 0, n - 3); invoker.Invoke(methodName, tmpargs, callback, errorEvent, returnType, resultMode, simple); return(null); } #if !(dotNET10 || dotNET11 || dotNETCF10 || dotNETMF) #if Core if ((n > 0) && paramTypes[n - 1].GetTypeInfo().IsGenericType&& paramTypes[n - 1].GetGenericTypeDefinition() == typeof(HproseCallback <>)) { IInvokeHelper helper = Activator.CreateInstance(typeof(InvokeHelper <>).MakeGenericType(paramTypes[n - 1].GenericTypeArguments)) as IInvokeHelper; #else if ((n > 0) && paramTypes[n - 1].IsGenericType && paramTypes[n - 1].GetGenericTypeDefinition() == typeof(HproseCallback <>)) { IInvokeHelper helper = Activator.CreateInstance(typeof(InvokeHelper <>).MakeGenericType(paramTypes[n - 1].GetGenericArguments())) as IInvokeHelper; #endif Delegate callback = (Delegate)args[n - 1]; object[] tmpargs = new object[n - 1]; Array.Copy(args, 0, tmpargs, 0, n - 1); helper.Invoke(invoker, methodName, tmpargs, callback, null, byRef, resultMode, simple); return(null); } #if Core if ((n > 0) && paramTypes[n - 1].GetTypeInfo().IsGenericType&& paramTypes[n - 1].GetGenericTypeDefinition() == typeof(HproseCallback1 <>)) { IInvokeHelper1 helper = Activator.CreateInstance(typeof(InvokeHelper1 <>).MakeGenericType(paramTypes[n - 1].GenericTypeArguments)) as IInvokeHelper1; #else if ((n > 0) && paramTypes[n - 1].IsGenericType && paramTypes[n - 1].GetGenericTypeDefinition() == typeof(HproseCallback1 <>)) { IInvokeHelper1 helper = Activator.CreateInstance(typeof(InvokeHelper1 <>).MakeGenericType(paramTypes[n - 1].GetGenericArguments())) as IInvokeHelper1; #endif Delegate callback = (Delegate)args[n - 1]; object[] tmpargs = new object[n - 1]; Array.Copy(args, 0, tmpargs, 0, n - 1); helper.Invoke(invoker, methodName, tmpargs, callback, null, resultMode, simple); return(null); } #if Core if ((n > 1) && paramTypes[n - 2].GetTypeInfo().IsGenericType&& paramTypes[n - 2].GetGenericTypeDefinition() == typeof(HproseCallback <>) && paramTypes[n - 1] == typeof(HproseErrorEvent)) { IInvokeHelper helper = Activator.CreateInstance(typeof(InvokeHelper <>).MakeGenericType(paramTypes[n - 1].GenericTypeArguments)) as IInvokeHelper; #else if ((n > 1) && paramTypes[n - 2].IsGenericType && paramTypes[n - 2].GetGenericTypeDefinition() == typeof(HproseCallback <>) && paramTypes[n - 1] == typeof(HproseErrorEvent)) { IInvokeHelper helper = Activator.CreateInstance(typeof(InvokeHelper <>).MakeGenericType(paramTypes[n - 1].GetGenericArguments())) as IInvokeHelper; #endif Delegate callback = (Delegate)args[n - 2]; HproseErrorEvent errorEvent = (HproseErrorEvent)args[n - 1]; object[] tmpargs = new object[n - 2]; Array.Copy(args, 0, tmpargs, 0, n - 2); helper.Invoke(invoker, methodName, tmpargs, callback, errorEvent, byRef, resultMode, simple); return(null); } #if Core if ((n > 1) && paramTypes[n - 2].GetTypeInfo().IsGenericType&& paramTypes[n - 2].GetGenericTypeDefinition() == typeof(HproseCallback1 <>) && paramTypes[n - 1] == typeof(HproseErrorEvent)) { IInvokeHelper1 helper = Activator.CreateInstance(typeof(InvokeHelper1 <>).MakeGenericType(paramTypes[n - 1].GenericTypeArguments)) as IInvokeHelper1; #else if ((n > 1) && paramTypes[n - 2].IsGenericType && paramTypes[n - 2].GetGenericTypeDefinition() == typeof(HproseCallback1 <>) && paramTypes[n - 1] == typeof(HproseErrorEvent)) { IInvokeHelper1 helper = Activator.CreateInstance(typeof(InvokeHelper1 <>).MakeGenericType(paramTypes[n - 1].GetGenericArguments())) as IInvokeHelper1; #endif Delegate callback = (Delegate)args[n - 2]; HproseErrorEvent errorEvent = (HproseErrorEvent)args[n - 1]; object[] tmpargs = new object[n - 2]; Array.Copy(args, 0, tmpargs, 0, n - 2); helper.Invoke(invoker, methodName, tmpargs, callback, errorEvent, resultMode, simple); return(null); } #endif if (returnType == typeof(void)) { returnType = null; } return(invoker.Invoke(methodName, args, returnType, byRef, resultMode, simple)); }
public object Invoke(object proxy, MethodInfo method, object[] args) { ParameterInfo[] parameters = method.GetParameters(); HproseResultMode resultMode = HproseResultMode.Normal; bool simple = false; string methodName = method.Name; #if dotNET45 Attribute rmAttr = method.GetCustomAttribute(typeof(ResultModeAttribute), true); if (rmAttr != null) { resultMode = (rmAttr as ResultModeAttribute).Value; } Attribute smAttr = method.GetCustomAttribute(typeof(SimpleModeAttribute), true); if (smAttr != null) { simple = (smAttr as SimpleModeAttribute).Value; } Attribute mnAttr = method.GetCustomAttribute(typeof(MethodNameAttribute), true); if (mnAttr != null) { methodName = (mnAttr as MethodNameAttribute).Value; } #else object[] resultModes = method.GetCustomAttributes(typeof(ResultModeAttribute), true); if (resultModes.Length == 1) { resultMode = (resultModes[0] as ResultModeAttribute).Value; } object[] simpleModes = method.GetCustomAttributes(typeof(SimpleModeAttribute), true); if (simpleModes.Length == 1) { simple = (simpleModes[0] as SimpleModeAttribute).Value; } object[] methodNames = method.GetCustomAttributes(typeof(MethodNameAttribute), true); if (methodNames.Length == 1) { methodName = (methodNames[0] as MethodNameAttribute).Value; } #endif if (ns != null && ns != "") { methodName = ns + '_' + methodName; } Type returnType = method.ReturnType; CheckResultType(resultMode, returnType); bool byRef = false; Type[] paramTypes = GetTypes(parameters); foreach (Type param in paramTypes) { if (param.IsByRef) { byRef = true; break; } } #if dotNET45 #if Core if (returnType.GetTypeInfo().IsGenericType&& returnType.GetGenericTypeDefinition() == typeof(Task <>)) { ITaskCreator taskCreator = Activator.CreateInstance(typeof(TaskCreator <>).MakeGenericType(returnType.GenericTypeArguments)) as ITaskCreator; #else if (returnType.IsGenericType && returnType.GetGenericTypeDefinition() == typeof(Task <>)) { ITaskCreator taskCreator = Activator.CreateInstance(typeof(TaskCreator <>).MakeGenericType(returnType.GetGenericArguments())) as ITaskCreator; #endif return(taskCreator.GetTask(invoker, methodName, args, byRef, resultMode, simple)); } if (returnType == typeof(Task)) { return(Task.Run(delegate() { invoker.Invoke(methodName, args, (Type)null, byRef, resultMode, simple); })); } #endif int n = paramTypes.Length; if ((n > 0) && (paramTypes[n - 1] == typeof(HproseCallback))) { HproseCallback callback = (HproseCallback)args[n - 1]; object[] tmpargs = new object[n - 1]; Array.Copy(args, 0, tmpargs, 0, n - 1); invoker.Invoke(methodName, tmpargs, callback, byRef, resultMode, simple); return(null); } if ((n > 0) && (paramTypes[n - 1] == typeof(HproseCallback1))) { HproseCallback1 callback = (HproseCallback1)args[n - 1]; object[] tmpargs = new object[n - 1]; Array.Copy(args, 0, tmpargs, 0, n - 1); invoker.Invoke(methodName, tmpargs, callback); return(null); } if ((n > 1) && (paramTypes[n - 2] == typeof(HproseCallback)) && (paramTypes[n - 1] == typeof(Type))) { HproseCallback callback = (HproseCallback)args[n - 2]; returnType = (Type)args[n - 1]; CheckResultType(resultMode, returnType); object[] tmpargs = new object[n - 2]; Array.Copy(args, 0, tmpargs, 0, n - 2); invoker.Invoke(methodName, tmpargs, callback, returnType, byRef, resultMode, simple); return(null); } if ((n > 1) && (paramTypes[n - 2] == typeof(HproseCallback1)) && (paramTypes[n - 1] == typeof(Type))) { HproseCallback1 callback = (HproseCallback1)args[n - 2]; returnType = (Type)args[n - 1]; CheckResultType(resultMode, returnType); object[] tmpargs = new object[n - 2]; Array.Copy(args, 0, tmpargs, 0, n - 2); invoker.Invoke(methodName, tmpargs, callback, returnType, resultMode, simple); return(null); } if ((n > 2) && (paramTypes[n - 3] == typeof(HproseCallback)) && (paramTypes[n - 2] == typeof(HproseErrorEvent)) && (paramTypes[n - 1] == typeof(Type))) { HproseCallback callback = (HproseCallback)args[n - 3]; HproseErrorEvent errorEvent = (HproseErrorEvent)args[n - 2]; returnType = (Type)args[n - 1]; CheckResultType(resultMode, returnType); object[] tmpargs = new object[n - 3]; Array.Copy(args, 0, tmpargs, 0, n - 3); invoker.Invoke(methodName, tmpargs, callback, errorEvent, returnType, byRef, resultMode, simple); return(null); } if ((n > 2) && (paramTypes[n - 3] == typeof(HproseCallback1)) && (paramTypes[n - 2] == typeof(HproseErrorEvent)) && (paramTypes[n - 1] == typeof(Type))) { HproseCallback1 callback = (HproseCallback1)args[n - 3]; HproseErrorEvent errorEvent = (HproseErrorEvent)args[n - 2]; returnType = (Type)args[n - 1]; CheckResultType(resultMode, returnType); object[] tmpargs = new object[n - 3]; Array.Copy(args, 0, tmpargs, 0, n - 3); invoker.Invoke(methodName, tmpargs, callback, errorEvent, returnType, resultMode, simple); return(null); } #if !(dotNET10 || dotNET11 || dotNETCF10) #if Core if ((n > 0) && paramTypes[n - 1].GetTypeInfo().IsGenericType&& paramTypes[n - 1].GetGenericTypeDefinition() == typeof(HproseCallback <>)) { IInvokeHelper helper = Activator.CreateInstance(typeof(InvokeHelper <>).MakeGenericType(paramTypes[n - 1].GenericTypeArguments)) as IInvokeHelper; #else if ((n > 0) && paramTypes[n - 1].IsGenericType && paramTypes[n - 1].GetGenericTypeDefinition() == typeof(HproseCallback <>)) { IInvokeHelper helper = Activator.CreateInstance(typeof(InvokeHelper <>).MakeGenericType(paramTypes[n - 1].GetGenericArguments())) as IInvokeHelper; #endif Delegate callback = (Delegate)args[n - 1]; object[] tmpargs = new object[n - 1]; Array.Copy(args, 0, tmpargs, 0, n - 1); helper.Invoke(invoker, methodName, tmpargs, callback, null, byRef, resultMode, simple); return(null); } #if Core if ((n > 0) && paramTypes[n - 1].GetTypeInfo().IsGenericType&& paramTypes[n - 1].GetGenericTypeDefinition() == typeof(HproseCallback1 <>)) { IInvokeHelper1 helper = Activator.CreateInstance(typeof(InvokeHelper1 <>).MakeGenericType(paramTypes[n - 1].GenericTypeArguments)) as IInvokeHelper1; #else if ((n > 0) && paramTypes[n - 1].IsGenericType && paramTypes[n - 1].GetGenericTypeDefinition() == typeof(HproseCallback1 <>)) { IInvokeHelper1 helper = Activator.CreateInstance(typeof(InvokeHelper1 <>).MakeGenericType(paramTypes[n - 1].GetGenericArguments())) as IInvokeHelper1; #endif Delegate callback = (Delegate)args[n - 1]; object[] tmpargs = new object[n - 1]; Array.Copy(args, 0, tmpargs, 0, n - 1); helper.Invoke(invoker, methodName, tmpargs, callback, null, resultMode, simple); return(null); } #if Core if ((n > 1) && paramTypes[n - 2].GetTypeInfo().IsGenericType&& paramTypes[n - 2].GetGenericTypeDefinition() == typeof(HproseCallback <>) && paramTypes[n - 1] == typeof(HproseErrorEvent)) { IInvokeHelper helper = Activator.CreateInstance(typeof(InvokeHelper <>).MakeGenericType(paramTypes[n - 1].GenericTypeArguments)) as IInvokeHelper; #else if ((n > 1) && paramTypes[n - 2].IsGenericType && paramTypes[n - 2].GetGenericTypeDefinition() == typeof(HproseCallback <>) && paramTypes[n - 1] == typeof(HproseErrorEvent)) { IInvokeHelper helper = Activator.CreateInstance(typeof(InvokeHelper <>).MakeGenericType(paramTypes[n - 1].GetGenericArguments())) as IInvokeHelper; #endif Delegate callback = (Delegate)args[n - 2]; HproseErrorEvent errorEvent = (HproseErrorEvent)args[n - 1]; object[] tmpargs = new object[n - 2]; Array.Copy(args, 0, tmpargs, 0, n - 2); helper.Invoke(invoker, methodName, tmpargs, callback, errorEvent, byRef, resultMode, simple); return(null); } #if Core if ((n > 1) && paramTypes[n - 2].GetTypeInfo().IsGenericType&& paramTypes[n - 2].GetGenericTypeDefinition() == typeof(HproseCallback1 <>) && paramTypes[n - 1] == typeof(HproseErrorEvent)) { IInvokeHelper1 helper = Activator.CreateInstance(typeof(InvokeHelper1 <>).MakeGenericType(paramTypes[n - 1].GenericTypeArguments)) as IInvokeHelper1; #else if ((n > 1) && paramTypes[n - 2].IsGenericType && paramTypes[n - 2].GetGenericTypeDefinition() == typeof(HproseCallback1 <>) && paramTypes[n - 1] == typeof(HproseErrorEvent)) { IInvokeHelper1 helper = Activator.CreateInstance(typeof(InvokeHelper1 <>).MakeGenericType(paramTypes[n - 1].GetGenericArguments())) as IInvokeHelper1; #endif Delegate callback = (Delegate)args[n - 2]; HproseErrorEvent errorEvent = (HproseErrorEvent)args[n - 1]; object[] tmpargs = new object[n - 2]; Array.Copy(args, 0, tmpargs, 0, n - 2); helper.Invoke(invoker, methodName, tmpargs, callback, errorEvent, resultMode, simple); return(null); } #endif if (returnType == typeof(void)) { returnType = null; } return(invoker.Invoke(methodName, args, returnType, byRef, resultMode, simple)); } } }