Пример #1
0
        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();
        }
Пример #2
0
        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);
        }