亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

ILGenerator.Emit動態 MSIL編程(三)之動態代理

系統 2009 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條評論
主站蜘蛛池模板: 中文字幕视频在线免费观看 | 97精品久久天干天天蜜 | 搜毛片 | 中文字幕在线精品视频入口一区 | 香蕉亚洲| 高清国产美女在线观看 | 精品国产成人 | 色综合久久最新中文字幕 | 精品三级国产一区二区三区四区 | 97影院论理手机在线观看 | 亚洲精品国产精品乱码不卞 | 黄色毛片一级 | 欧洲午夜视频 | 大色综合色综合资源站 | 四虎影视精品永久免费 | 亚洲一区二区欧美 | 在线视频综合视频免费观看 | 国产欧美日韩综合 | 激情五月婷婷久久 | er久99久热只有精品国产 | 国产亚洲欧美一区二区三区 | 成人午夜精品久久久久久久小说 | 99re6久精品国产首页 | 色婷婷天天综合在线 | 亚洲一区二区免费在线观看 | 911国产在线观看精品 | 99视频在线永久免费观看 | 爱爱小视频免费体验区在线观看 | 日韩欧美视频一区二区在线观看 | 欧美日韩免费看 | 日本一区精品久久久久影院 | 国产精品婷婷久青青原 | 美女黄色一级毛片 | 日本在线不卡视频 | 涩涩视频免费观看 | 亚洲国产另类久久久精品小说 | 在线成人a毛片免费播放 | 五月色婷婷六月噜噜 | 国产精品香蕉在线观看首页 | 精品欧美一区手机在线观看 | 久久久久久久国产精品影院 |