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

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條評論
主站蜘蛛池模板: 一级特黄特交牲大片 | 天天色天天干天天射 | 亚洲图片欧美在线 | 京野结衣免费一区二区 | 伊人888| 国产永久免费爽视频在线 | 亚洲激情视频网 | 久久国产精品吴梦梦 | 99久久精品免费看国产 | 欧美日韩中文国产一区 | 色综合天天| 999热成人精品国产免 | 99久久免费国产精品热 | 91在线看 | 色香欲综合成人免费视频 | 日韩欧美手机在线 | 天天操国产 | 亚洲国产精品婷婷久久久久 | 综合久久久久久 | 999精品免费视频 | 久久婷婷综合在线视频观看6 | 国产乱码在线精品可播放 | 国产一区二区久久久 | 久久99精品久久久久久 | 欧美日韩视频精品一区二区 | 国产手机精品一区二区 | 国产成人精品免费视频大全办公室 | 成人 亚洲 | 日本a∨在线播放高清 | 午夜精品久久久久久久99热 | 日本一区二区在线视频 | 性视频一级 | 九九热精品免费观看 | 日韩一区二区三 | 久久综合久久综合久久综合 | 夜夜爽夜夜操 | 亚洲一级毛片免费在线观看 | 久久色伊人 | 国产夜色 | www国产视频 | 一本一道波多野结衣一区二区 |