ILGenerator.Emit动态 MSIL编程(三)之动态代理

系统 1983 0
      
        using
      
      
         System;

    
      
      
        using
      
      
         System.Linq;

    
      
      
        using
      
      
         System.Reflection;

    
      
      
        using
      
      
         System.Reflection.Emit;



    
      
      
        public
      
      
        sealed
      
      
        class
      
      
         DynamicProxy

    {

        
      
      
        private
      
      
        static
      
      
        readonly
      
      
        string
      
       AssemblyName = 
      
        "
      
      
        DynamicProxy
      
      
        "
      
      
        , 

                                       ModuleName 
      
      = 
      
        "
      
      
        DynamicProxy
      
      
        "
      
      
        , 

                                       TypeName 
      
      = 
      
        "
      
      
        DynamicProxy
      
      
        "
      
      
        ;

        
      
      
        private
      
       AssemblyBuilder CreateDynamicAssembly<T>() 
      
        where
      
       T : 
      
        class
      
      
        

        {

            
      
      
        return
      
       AppDomain.CurrentDomain.DefineDynamicAssembly(
      
        new
      
       AssemblyName(AssemblyName + 
      
        typeof
      
      
        (T).Name),

                AssemblyBuilderAccess.Run);

        }

        
      
      
        private
      
       ModuleBuilder CreateDynamicModule<T>() 
      
        where
      
       T : 
      
        class
      
      
        

        {

            
      
      
        return
      
       CreateDynamicAssembly<T>().DefineDynamicModule(ModuleName + 
      
        typeof
      
      
        (T).Name);

        }

        
      
      
        ///
      
      
        <summary>
      
      
        ///
      
      
         创建动态代理

        
      
      
        ///
      
      
        </summary>
      
      
        public
      
       T CreateDynamicType<T>() 
      
        where
      
       T : 
      
        class
      
      ,
      
        new
      
      
        ()

        {

            TypeBuilder typeBuilder 
      
      = CreateDynamicModule<T>().DefineType(TypeName + 
      
        typeof
      
      (T).Name, TypeAttributes.Public |
      
         

                TypeAttributes.Class, 
      
      
        typeof
      
      
        (T));

            TypeActuator
      
      <T>
      
        (typeBuilder);

            
      
      
        return
      
       Activator.CreateInstance(typeBuilder.CreateType()) 
      
        as
      
      
         T;

        }

        
      
      
        private
      
      
        void
      
      
         BuildCtorMethod(Type classType, FieldBuilder fieldBuilder, TypeBuilder typeBuilder)

        {

            
      
      
        var
      
       structureBuilder = typeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard,
      
        null
      
      
        );

            
      
      
        var
      
       ilCtor =
      
         structureBuilder.GetILGenerator();

            ilCtor.Emit(OpCodes.Ldarg_0);

            ilCtor.Emit(OpCodes.Newobj, classType.GetConstructor(Type.EmptyTypes));

            ilCtor.Emit(OpCodes.Stfld, fieldBuilder);

            ilCtor.Emit(OpCodes.Ret);

        }

        
      
      
        private
      
      
        void
      
      
         BuildMethod(ILGenerator il, MethodInfo methodInfo, Type[] ParameterTypes)

        {

            il.Emit(OpCodes.Ldarg_0);

            
      
      
        for
      
       (
      
        int
      
       i = 
      
        0
      
      ; i < ParameterTypes.Length; i++
      
        )

                il.Emit(OpCodes.Ldarg_S, (
      
      
        short
      
      )(i + 
      
        1
      
      
        ));

            il.Emit(OpCodes.Call, methodInfo);

            il.Emit(OpCodes.Ret);

        }

        
      
      
        private
      
      
        void
      
       TypeActuator<T>(TypeBuilder builder) 
      
        where
      
       T : 
      
        class
      
      
        

        {

            FieldBuilder fieldBuilder 
      
      = builder.DefineField(
      
        "
      
      
        _DynamicProxyActuator
      
      
        "
      
      , 
      
        typeof
      
      
        (T), FieldAttributes.Private);

            BuildCtorMethod(
      
      
        typeof
      
      
        (T), fieldBuilder, builder);

            MethodInfo[] info 
      
      = GetMethodInfo(
      
        typeof
      
      
        (T));

            
      
      
        foreach
      
       (MethodInfo methodInfo 
      
        in
      
      
         info)

            {

                
      
      
        if
      
       (!methodInfo.IsVirtual && !methodInfo.IsAbstract) 
      
        continue
      
      
        ;

                
      
      
        if
      
       (methodInfo.Name == 
      
        "
      
      
        ToString
      
      
        "
      
      ) 
      
        continue
      
      
        ;

                
      
      
        if
      
       (methodInfo.Name == 
      
        "
      
      
        GetHashCode
      
      
        "
      
      ) 
      
        continue
      
      
        ;

                
      
      
        if
      
       (methodInfo.Name == 
      
        "
      
      
        Equals
      
      
        "
      
      ) 
      
        continue
      
      
        ;

                
      
      
        var
      
       ParameterTypes = methodInfo.GetParameters().Select(p =>
      
         p.ParameterType).ToArray();

                MethodBuilder methodBuilder 
      
      = CreateMethod(builder, methodInfo.Name, MethodAttributes.Public |
      
         MethodAttributes.Virtual,

                    CallingConventions.Standard, methodInfo.ReturnType, ParameterTypes);

                
      
      
        var
      
       ilMethod =
      
         methodBuilder.GetILGenerator();

                BuildMethod(ilMethod, methodInfo, ParameterTypes);

            }

        }

        
      
      
        private
      
       MethodBuilder CreateMethod(TypeBuilder typeBuilder, 
      
        string
      
      
         name, MethodAttributes attrs, CallingConventions callingConventions, 

            Type type, Type[] parameterTypes)

        {

            
      
      
        return
      
      
         typeBuilder.DefineMethod(name, attrs, callingConventions, type, parameterTypes);

        }

        
      
      
        private
      
      
         MethodInfo[] GetMethodInfo(Type type)

        {

            
      
      
        return
      
       type.GetMethods(BindingFlags.Public |
      
         BindingFlags.Instance);

        }

    }
      
    

 

ILGenerator.Emit动态 MSIL编程(三)之动态代理


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论