public static async Task <MethodProxy> Receive(MethodProxy methodProxy) { object defaultValue = default(object); try { Type iface = methodProxy.InterfaceType.ResolvedType(); object concreteService = DependencyServiceExtension.Get(iface); MethodInfo baseMethod = MethodProxyHelper.GetClassMethodInfo(concreteService.GetType(), iface, methodProxy.MethodIndex); //In case of failure, getting Default Return Type defaultValue = GetDefault(baseMethod.ReturnType); DispatchInvokation(methodProxy, baseMethod, concreteService); if (methodProxy.AsyncTask) { await((Task)methodProxy.ReturnValue); } methodProxy.ReturnValue = GetResultFromTask(methodProxy.ReturnType.ResolvedType(), (Task)methodProxy.ReturnValue); } catch (Exception ex) { ConsoleHelper.WriteError($"[Native] - {(ex.InnerException != null ? ex.InnerException.Message : ex.Message)}"); methodProxy.ExceptionDescriptor = new ExceptionDescriptor(ex.InnerException != null ? ex.InnerException : ex); methodProxy.ReturnValue = defaultValue; methodProxy.TaskSuccess = false; } return(methodProxy); }
public static MethodProxy Receive(string methodProxyJson) { object defaultValue = default(object); MethodProxy methodProxy = null; try { methodProxy = BridgeSerializer.Deserialize <MethodProxy>(methodProxyJson); Type iface = methodProxy.InterfaceType.ResolvedType(); object concreteService = DependencyServiceExtension.Get(iface); MethodInfo baseMethod = MethodProxyHelper.GetClassMethodInfo(concreteService.GetType(), iface, methodProxy.MethodIndex); //In case of failure, getting Default Return Type defaultValue = GetDefault(baseMethod.ReturnType); if (methodProxy.GenericTypes != null && methodProxy.GenericTypes.Length > 0) { Type[] genericTypes = methodProxy.GenericTypes.Select(p => p.ResolvedType()).ToArray(); methodProxy.ReturnValue = baseMethod.MakeGenericMethod(genericTypes).Invoke(concreteService, methodProxy.Parameters); methodProxy.TaskSuccess = true; } else { methodProxy.ReturnValue = baseMethod.Invoke(concreteService, methodProxy.Parameters); methodProxy.TaskSuccess = true; } if (methodProxy.AsyncTask) { methodProxy.ReturnValue = GetResultFromTask(methodProxy.ReturnType.ResolvedType(), (Task)methodProxy.ReturnValue); } } catch (Exception) { methodProxy.ReturnValue = defaultValue; methodProxy.TaskSuccess = false; } return(methodProxy); }
public static MethodProxy Receive(MethodProxy methodProxy) { object defaultValue = default(object); try { Type iface = methodProxy.InterfaceType.ResolvedType(); object concreteService = DependencyServiceExtension.Get(iface); MethodInfo baseMethod = MethodProxyHelper.GetClassMethodInfo(concreteService.GetType(), iface, methodProxy.MethodIndex); //In case of failure, getting Default Return Type defaultValue = GetDefault(baseMethod.ReturnType); if (methodProxy.GenericTypes != null && methodProxy.GenericTypes.Length > 0) { Type[] genericTypes = methodProxy.GenericTypes.Select(p => p.ResolvedType()).ToArray(); methodProxy.ReturnValue = baseMethod.MakeGenericMethod(genericTypes).Invoke(concreteService, methodProxy.Parameters); methodProxy.TaskSuccess = true; } else { methodProxy.ReturnValue = baseMethod.Invoke(concreteService, methodProxy.Parameters); methodProxy.TaskSuccess = true; } if (methodProxy.AsyncTask) { methodProxy.ReturnValue = GetResultFromTask(methodProxy.ReturnType.ResolvedType(), (Task)methodProxy.ReturnValue); } } catch (Exception ex) { ConsoleHelper.WriteError($"[Native] - {(ex.InnerException != null ? ex.InnerException.Message : ex.Message)}"); methodProxy.ExceptionDescriptor = new ExceptionDescriptor(ex.InnerException != null ? ex.InnerException : ex); methodProxy.ReturnValue = defaultValue; methodProxy.TaskSuccess = false; } return(methodProxy); }
public static async Task <MethodProxy> Receive(MethodProxy methodProxy) { object defaultValue = default(object); try { Type iface = methodProxy.InterfaceType.ResolvedType(); object concreteService = DependencyServiceExtension.Get(iface); if (concreteService == null) { //iface should not be null string error = $"The service implementation class of your interface '{iface.Name}' was not found on native side. If you are targeting UWP with .NET native toolchain, you must register your services through 'DependencyService.Register' at startup as the toolchain may strip your class from assembly at build time"; ConsoleHelper.WriteError(error); throw new InvalidOperationException(error); } MethodInfo baseMethod = MethodProxyHelper.GetClassMethodInfo(concreteService.GetType(), iface, methodProxy); //In case of failure, getting Default Return Type defaultValue = GetDefault(baseMethod.ReturnType); DispatchInvokation(methodProxy, baseMethod, concreteService); if (methodProxy.AsyncTask) { await((Task)methodProxy.ReturnValue); } methodProxy.ReturnValue = GetResultFromTask(methodProxy.ReturnType.ResolvedType(), (Task)methodProxy.ReturnValue); } catch (Exception ex) { ConsoleHelper.WriteError($"[Native] - {(ex.InnerException != null ? ex.InnerException.Message : ex.Message)}"); methodProxy.ExceptionDescriptor = new ExceptionDescriptor(ex.InnerException != null ? ex.InnerException : ex); methodProxy.ReturnValue = defaultValue; methodProxy.TaskSuccess = false; } return(methodProxy); }