private void AddGetReturnValueMethod( TypeBuilder classBuilder, IDictionary <InterfaceDescription, MethodBodyTypesBuildResult> methodBodyTypesResultsMap) { var methodBuilder = CodeBuilderUtils.CreateProtectedMethodBuilder( classBuilder, "GetReturnValue", typeof(object), // return value from the reponseBody typeof(int), // interfaceId typeof(int), // methodId typeof(object)); // responseBody var ilGen = methodBuilder.GetILGenerator(); foreach (var item in methodBodyTypesResultsMap) { var interfaceDescription = item.Key; var methodBodyTypesMap = item.Value.MethodBodyTypesMap; foreach (var methodDescription in interfaceDescription.Methods) { var methodBodyTypes = methodBodyTypesMap[methodDescription.Name]; if (methodBodyTypes.ResponseBodyType == null) { continue; } var elseLabel = ilGen.DefineLabel(); this.AddIfInterfaceIdAndMethodIdReturnRetvalBlock( ilGen, elseLabel, interfaceDescription.Id, methodDescription.Id, methodBodyTypes.ResponseBodyType); ilGen.MarkLabel(elseLabel); } } // return null; (if method id's and interfaceId do not match) ilGen.Emit(OpCodes.Ldnull); ilGen.Emit(OpCodes.Ret); }
private void AddOnDispatchAsyncMethod( TypeBuilder classBuilder, InterfaceDescription interfaceDescription, MethodBodyTypesBuildResult methodBodyTypesBuildResult) { var dispatchMethodImpl = CodeBuilderUtils.CreateProtectedMethodBuilder( classBuilder, "OnDispatchAsync", typeof(Task <object>), typeof(int), // methodid typeof(object), // remoted object typeof(object), // requestBody typeof(CancellationToken)); // CancellationToken var ilGen = dispatchMethodImpl.GetILGenerator(); var castedObject = ilGen.DeclareLocal(interfaceDescription.InterfaceType); ilGen.Emit(OpCodes.Ldarg_2); // load remoted object ilGen.Emit(OpCodes.Castclass, interfaceDescription.InterfaceType); ilGen.Emit(OpCodes.Stloc, castedObject); // store casted result to local 0 foreach (var methodDescription in interfaceDescription.Methods) { if (!TypeUtility.IsTaskType(methodDescription.ReturnType)) { continue; } var elseLable = ilGen.DefineLabel(); this.AddIfMethodIdInvokeAsyncBlock( ilGen: ilGen, elseLabel: elseLable, castedObject: castedObject, methodDescription: methodDescription, methodBodyTypes: methodBodyTypesBuildResult.MethodBodyTypesMap[methodDescription.Name]); ilGen.MarkLabel(elseLable); } ilGen.ThrowException(typeof(MissingMethodException)); }
private void AddCreateResponseBodyMethod( TypeBuilder classBuilder, InterfaceDescription interfaceDescription, MethodBodyTypesBuildResult methodBodyTypesBuildResult) { var methodBuilder = CodeBuilderUtils.CreateProtectedMethodBuilder( classBuilder, "CreateResponseBody", typeof(object), // responseBody - return value typeof(int), // methodId typeof(object)); // retval from the invoked method on the remoted object var ilGen = methodBuilder.GetILGenerator(); foreach (var methodDescription in interfaceDescription.Methods) { var methodBodyTypes = methodBodyTypesBuildResult.MethodBodyTypesMap[methodDescription.Name]; if (methodBodyTypes.ResponseBodyType == null) { continue; } var elseLabel = ilGen.DefineLabel(); this.AddIfMethodIdCreateResponseBlock( ilGen, elseLabel, methodDescription.Id, methodBodyTypes.ResponseBodyType); ilGen.MarkLabel(elseLabel); } // return null; (if method id's do not match) ilGen.Emit(OpCodes.Ldnull); ilGen.Emit(OpCodes.Ret); }