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

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條評論
主站蜘蛛池模板: 久久精品re | 国产精品bdsm在线调教 | 久久这里只有精品国产 | 久久99久久精品久久久久久 | sese在线播放| 免费永久欧美性色xo影院 | 亚洲性事| 狠狠久久综合伊人不卡 | 97视频在线视频 | 国产片网址 | 九9热这里真品 | 亚洲视频三级 | 久久天天躁狠狠躁夜夜爽 | 国内自拍一二三四2021 | 国内自拍tv在线 | 丹武至尊在线观看动漫 | 久久精品国产福利国产秒 | 国内毛片视频 | 国产亚洲欧美成人久久片 | 天天爽天天摸 | 乱人伦中文字幕在线看 | 天天怕夜夜怕狠狠怕 | 99精品视频在线成人精彩视频 | 中文字幕天天躁夜夜狠狠综合 | 中文字幕久久久久一区 | 久青草国产观看在线视频 | 国产一级高清视频 | 欧美日韩免费播放一区二区 | 国产综合社区 | 欧美一区二区三区精品国产 | 亚洲精品香蕉一区二区 | 青青青国产深夜福利视频 | 国产精品一区二区久久精品涩爱 | 99热在线这里只有精品 | 搜毛片| 国产成人精品久久一区二区三区 | 国产午夜精品久久久久免费视 | 成人一区视频 | 国产精品久久永久免费 | 中文字幕在线亚洲精品 | 久草视频免费在线播放 |