public override void AddService(ServiceBase service) { if (service.ExposedState == ExposedServiceStateType.Base) { return; } this.AddServiceInterface(service); Type type = this.dCTypeStore.GetDCBuilderType("ServiceBase").Type; DCBuilderType dcBuilderType1 = this.dCTypeStore.GetDCBuilderType("I" + service.Name + "Service"); DCBuilderType dcBuilderType2 = this.dCTypeStore.GetDCBuilderType(service.Name); TypeBuilder typeBuilder = this.moduleBuilder.DefineType(this.nameSpacePrefix + service.Name + "Service", TypeAttributes.Public, type, new Type[1] { dcBuilderType1.Type }); DCBuilderType dcBuilderType3 = this.dCTypeStore.GetDCBuilderType(service.Name + "_Request"); DCBuilderType dcBuilderType4 = this.dCTypeStore.GetDCBuilderType(service.Name + "_Result"); DCBuilderType dcBuilderType5 = this.dCTypeStore.GetDCBuilderType("ResultStatus"); DCBuilderType dcBuilderType6 = this.dCTypeStore.GetDCBuilderType(service.Name + "_Parameters"); DCBuilderType dcBuilderType7 = this.dCTypeStore.GetDCBuilderType("UserProfile"); foreach (IMethod method1 in service.GetMethods()) { if (method1.ExposedState == ExposedMethodStateType.Exposed || method1.ExposedState == ExposedMethodStateType.BaseAndExposed) { Method method2 = method1 as Method; Type[] parameterTypes = new Type[5] { dcBuilderType7.Type, dcBuilderType2.Type, dcBuilderType6.Type, dcBuilderType3.Type, dcBuilderType4.Type.MakeByRefType() }; if (method2.HasParameters) { parameterTypes[2] = this.dCTypeStore.GetDCBuilderType(service.Name + "_" + method2.Name + "_Parameters").Type; } MethodBuilder methodBuilder = typeBuilder.DefineMethod(method2.Name, MethodAttributes.Public | MethodAttributes.Final | MethodAttributes.Virtual | MethodAttributes.VtableLayoutMask, dcBuilderType5.Type, parameterTypes); methodBuilder.DefineParameter(1, ParameterAttributes.None, "userProfile"); methodBuilder.DefineParameter(2, ParameterAttributes.None, service.Name.Substring(0, 1).ToLower() + service.Name.Substring(1)); methodBuilder.DefineParameter(3, ParameterAttributes.None, "parameters"); methodBuilder.DefineParameter(4, ParameterAttributes.None, "request"); methodBuilder.DefineParameter(5, ParameterAttributes.Out, "result"); ILGenerator ilGenerator = methodBuilder.GetILGenerator(); ilGenerator.DeclareLocal(dcBuilderType5.Type); ilGenerator.Emit(OpCodes.Ldarg_S, 5); ilGenerator.Emit(OpCodes.Newobj, dcBuilderType4.Type.GetConstructor(Type.EmptyTypes)); ilGenerator.Emit(OpCodes.Stind_Ref); ilGenerator.Emit(OpCodes.Ldarg_0); ilGenerator.Emit(OpCodes.Ldstr, method2.Name); ilGenerator.Emit(OpCodes.Ldarg_1); ilGenerator.Emit(OpCodes.Ldarg_2); ilGenerator.Emit(OpCodes.Ldarg_3); ilGenerator.Emit(OpCodes.Ldarg_S, 4); ilGenerator.Emit(OpCodes.Ldarg_S, 5); ilGenerator.Emit(OpCodes.Ldind_Ref); ilGenerator.Emit(OpCodes.Call, type.GetMethod("CallMethod", BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.NonPublic)); ilGenerator.Emit(OpCodes.Stloc_0); Label label = ilGenerator.DefineLabel(); ilGenerator.Emit(OpCodes.Br_S, label); ilGenerator.MarkLabel(label); ilGenerator.Emit(OpCodes.Ldloc_0); ilGenerator.Emit(OpCodes.Ret); } } this.AddCommitTransactionMethod(service, typeBuilder, type); this.AddExecuteTransactionMethod(service, typeBuilder, type); this.AddGetEnvironmentMethod(service, typeBuilder, type); typeBuilder.CreateType(); }
protected void AddServiceInterface(ServiceBase service) { bool isForClient = this is ClientGenerator; if (service.ExposedState != ExposedServiceStateType.Exposed && !this._IsSilverlight) { DCBuilderType dcBuilderType1 = (DCBuilderType)null; if (service.ParentWCFServiceBaseType != null) { dcBuilderType1 = this.dCTypeStore.GetDCBuilderType("I" + service.ParentWCFServiceBaseType.Name + "Base"); } if (dcBuilderType1 == null) { dcBuilderType1 = this.dCTypeStore.GetDCBuilderType("IWCFService"); } if (dcBuilderType1 != null) { TypeBuilder typeBuilder = this.moduleBuilder.DefineType(this.nameSpacePrefix + "I" + service.Name + "Base", TypeAttributes.Public | TypeAttributes.ClassSemanticsMask | TypeAttributes.Abstract, (Type)null, new Type[1] { dcBuilderType1.Type }); DCBuilderType dcBuilderType2 = this.dCTypeStore.GetDCBuilderType("DCObject"); DCBuilderType dcBuilderType3 = this.dCTypeStore.GetDCBuilderType("Request"); DCBuilderType dcBuilderType4 = this.dCTypeStore.GetDCBuilderType("Result"); DCBuilderType dcBuilderType5 = this.dCTypeStore.GetDCBuilderType("Parameters"); List <MethodInfo> methodInfoList = new List <MethodInfo>(); methodInfoList.AddRange((IEnumerable <MethodInfo>)dcBuilderType1.Type.GetMethods(BindingFlags.Instance | BindingFlags.Public)); foreach (Type type in dcBuilderType1.Type.GetInterfaces()) { methodInfoList.AddRange((IEnumerable <MethodInfo>)type.GetMethods(BindingFlags.Instance | BindingFlags.Public)); } foreach (IMethod method1 in service.GetMethods()) { if (method1.ExposedState == ExposedMethodStateType.Base || method1.ExposedState == ExposedMethodStateType.BaseAndExposed) { if (method1.IsInherited) { bool flag = false; foreach (MethodInfo methodInfo in methodInfoList) { if (method1.Name == methodInfo.Name) { flag = true; } } if (flag) { continue; } } Method method2 = method1 as Method; Type[] parameterTypes1 = new Type[4] { dcBuilderType2.Type, dcBuilderType5.Type, dcBuilderType3.Type, dcBuilderType4.Type.MakeByRefType() }; MethodBuilder methodBuilder1 = this.DefineMethod(method2.Name, parameterTypes1, typeBuilder); methodBuilder1.DefineParameter(1, ParameterAttributes.None, service.Name.Substring(0, 1).ToLower() + service.Name.Substring(1)); methodBuilder1.DefineParameter(2, ParameterAttributes.None, "parameters"); methodBuilder1.DefineParameter(3, ParameterAttributes.None, "request"); methodBuilder1.DefineParameter(4, ParameterAttributes.Out, "result"); Type[] parameterTypes2 = new Type[3] { dcBuilderType2.Type, dcBuilderType3.Type, dcBuilderType4.Type.MakeByRefType() }; MethodBuilder methodBuilder2 = this.DefineMethod(method2.Name, parameterTypes2, typeBuilder); methodBuilder2.DefineParameter(1, ParameterAttributes.None, service.Name.Substring(0, 1).ToLower() + service.Name.Substring(1)); methodBuilder2.DefineParameter(2, ParameterAttributes.None, "request"); methodBuilder2.DefineParameter(3, ParameterAttributes.Out, "result"); Type[] parameterTypes3 = new Type[1] { dcBuilderType2.Type }; this.DefineMethod(method2.Name, parameterTypes3, typeBuilder).DefineParameter(1, ParameterAttributes.None, service.Name.Substring(0, 1).ToLower() + service.Name.Substring(1)); this.DefineMethod(method2.Name, Type.EmptyTypes, typeBuilder); } } this.dCTypeStore.Add("I" + service.Name + "Base", typeBuilder.CreateType(), typeBuilder); } } if (service.ExposedState == ExposedServiceStateType.Base) { return; } TypeBuilder typeBuilder1 = (TypeBuilder)null; if (!this._IsSilverlight) { typeBuilder1 = this.moduleBuilder.DefineType(this.nameSpacePrefix + "I" + service.Name + "Service", TypeAttributes.Public | TypeAttributes.ClassSemanticsMask | TypeAttributes.Abstract); CustomAttributeBuilder customBuilder = new CustomAttributeBuilder(typeof(ServiceContractAttribute).GetConstructor(Type.EmptyTypes), new object[0]); typeBuilder1.SetCustomAttribute(customBuilder); } DCBuilderType dcBuilderType6 = this.dCTypeStore.GetDCBuilderType(service.Name); this.AddResultType(dcBuilderType6, isForClient); this.AddRequestType(dcBuilderType6, isForClient); this.AddParameterType(dcBuilderType6); DCBuilderType dcBuilderType7 = this.dCTypeStore.GetDCBuilderType(service.Name + "_Request"); DCBuilderType dcBuilderType8 = this.dCTypeStore.GetDCBuilderType(service.Name + "_Result"); DCBuilderType dcBuilderType9 = this.dCTypeStore.GetDCBuilderType(service.Name + "_Parameters"); DCBuilderType dcBuilderType10 = this.dCTypeStore.GetDCBuilderType("UserProfile"); EnumBuilder enumBuilder1 = this.DefineEnum(this.nameSpacePrefix + service.Name + "Methods"); int num = 0; foreach (IMethod method1 in service.GetMethods()) { if (method1.ExposedState == ExposedMethodStateType.Exposed || method1.ExposedState == ExposedMethodStateType.BaseAndExposed) { Method method2 = method1 as Method; Type[] parameterTypes = new Type[5] { dcBuilderType10.Type, dcBuilderType6.Type, dcBuilderType9.Type, dcBuilderType7.Type, dcBuilderType8.Type.MakeByRefType() }; if (method2.HasParameters) { this.AddMethodParametersType(service.Name, method2, isForClient); parameterTypes[2] = this.dCTypeStore.GetDCBuilderType(service.Name + "_" + method2.Name + "_Parameters").Type; } if (!this._IsSilverlight) { MethodBuilder methodBuilder = this.DefineMethod(method2.Name, parameterTypes, typeBuilder1); methodBuilder.DefineParameter(1, ParameterAttributes.None, "userProfile"); methodBuilder.DefineParameter(2, ParameterAttributes.None, service.Name.Substring(0, 1).ToLower() + service.Name.Substring(1)); methodBuilder.DefineParameter(3, ParameterAttributes.None, "parameters"); methodBuilder.DefineParameter(4, ParameterAttributes.None, "request"); methodBuilder.DefineParameter(5, ParameterAttributes.Out, "result"); } this.DefineLiteral(enumBuilder1, method1.Name, num++, (string)null, (DCField)null); } } EnumBuilder enumBuilder2 = enumBuilder1; int number1 = num; int number2 = number1 + 1; this.DefineLiteral(enumBuilder2, "ExecuteTransaction", number1, (string)null, (DCField)null); this.DefineLiteral(enumBuilder1, "AddDataTransaction", number2, (string)null, (DCField)null); this.dCTypeStore.Add(service.Name + "Methods", enumBuilder1.CreateType(), (TypeBuilder)null); DCBuilderType dcBuilderType11 = this.dCTypeStore.GetDCBuilderType(service.Name + "Methods"); this.AddMethodType(service.Name, dcBuilderType11, dcBuilderType9); if (this._IsSilverlight) { return; } this.AddCommitTransactionMethod(service, dcBuilderType10, typeBuilder1, dcBuilderType7, dcBuilderType8); this.AddExecuteTransactionMethod(service, dcBuilderType10, typeBuilder1, dcBuilderType6, dcBuilderType7, dcBuilderType8); this.AddGetEnvironmentMethod(service, dcBuilderType10, typeBuilder1, dcBuilderType6, dcBuilderType7, dcBuilderType8); this.dCTypeStore.Add("I" + service.Name + "Service", typeBuilder1.CreateType(), typeBuilder1); }