<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      基礎才是重中之重~Emit動態構建方法(參數和返回值)

      回到目錄

      對于Emit我們知道它的可以動態構建程序集,類型,方法,屬性等,或者說只要手動使用C#創建的東西使用Emit也都可以動態創建它們,Emit由于它的特別之處,所以在很多領域得到了廣泛的應用,像最近比較火的AOP技術,它最核心的功能就是方法攔截了,我們使用Emit也是可以實現方法攔截功能的,詳細可以看大叔這篇文章《Lind.DDD.Aspects通過Plugins實現方法的動態攔截~Lind里的AOP》。

      有參數,沒有返回值的方法構建與調用

              [TestMethod]
              public void BulidMethod()
              {
                  //得到當前的應用程序域
                  AppDomain appDm = AppDomain.CurrentDomain;
                  //初始化AssemblyName的一個實例
                  AssemblyName an = new AssemblyName();
                  //設置程序集的名稱
                  an.Name = "EmitLind";
                  //動態的在當前應用程序域創建一個應用程序集
                  AssemblyBuilder ab = appDm.DefineDynamicAssembly(an, AssemblyBuilderAccess.Run);
                  //動態在程序集內創建一個模塊
                  ModuleBuilder mb = ab.DefineDynamicModule("EmitLind");
                  //動態的在模塊內創建一個類
                  TypeBuilder tb = mb.DefineType("HelloEmit", TypeAttributes.Public | TypeAttributes.Class);
                  //動態的為類里創建一個方法
                  MethodBuilder mdb = tb.DefineMethod("HelloWord", MethodAttributes.Public, null, new Type[] { typeof(string) });
      
                  //得到該方法的ILGenerator
                  ILGenerator ilG = mdb.GetILGenerator();
                  ilG.Emit(OpCodes.Ldstr, "Hello:{0}");
                  //加載傳入方法的參數到堆棧
                  ilG.Emit(OpCodes.Ldarg_1);
                  //調用Console.WriteLine方法,輸出傳入的字符
                  ilG.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string), typeof(string) }));
      
                  ilG.Emit(OpCodes.Ret);
                  //創建類的Type對象
                  Type tp = tb.CreateType();
                  //實例化一個類
                  object ob = Activator.CreateInstance(tp);
                  //得到類中的方法,通過Invoke來觸發方法的調用..
                  MethodInfo mdi = tp.GetMethod("HelloWord");
                  mdi.Invoke(ob, new object[] { "Hello Lind" });
              }

      有參數,同時有返回值的方法構建與調用

              public void BulidMethodRet()
              {
      
                  //得到當前的應用程序域
                  AppDomain appDm = AppDomain.CurrentDomain;
                  //初始化AssemblyName的一個實例
                  AssemblyName an = new AssemblyName();
                  //設置程序集的名稱
                  an.Name = "EmitLind";
                  //動態的在當前應用程序域創建一個應用程序集
                  AssemblyBuilder ab = appDm.DefineDynamicAssembly(an, AssemblyBuilderAccess.Run);
                  //動態在程序集內創建一個模塊
                  ModuleBuilder mb = ab.DefineDynamicModule("EmitLind");
                  //動態的在模塊內創建一個類
                  TypeBuilder tb = mb.DefineType("HelloEmit", TypeAttributes.Public | TypeAttributes.Class);
                
                  //動態的為類里創建一個方法
                  MethodBuilder mdb = tb.DefineMethod(
                      "HelloWorldReturn",
                      MethodAttributes.Public,
                      typeof(string),
                      new Type[] { typeof(string), typeof(string) });
      
                  //得到該方法的ILGenerator
                  ILGenerator ilG = mdb.GetILGenerator();
                  ilG.Emit(OpCodes.Ldstr, "你好:{0}-{1}");
                  //加載傳入方法的參數到堆棧
                  ilG.Emit(OpCodes.Ldarg_1); 
                  ilG.Emit(OpCodes.Ldarg_2);
                  //調用Console.WriteLine方法,輸出傳入的字符
                  ilG.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string), typeof(string) ,typeof(string)}));
      
                  // ilG.Emit(OpCodes.Pop);//加這個就有問題了
                  //返回值部分
                  LocalBuilder local = ilG.DeclareLocal(typeof(string));
                  ilG.Emit(OpCodes.Ldstr, "Return Value:{0}");
                  ilG.Emit(OpCodes.Ldarg_1);
                  ilG.Emit(OpCodes.Call, typeof(string).GetMethod("Format", new Type[] { typeof(string), typeof(string) }));
                  ilG.Emit(OpCodes.Stloc_0, local);
                  ilG.Emit(OpCodes.Ldloc_0, local);
                  ilG.Emit(OpCodes.Ret);
                  //創建類的Type對象
                  Type tp = tb.CreateType();
                  //實例化一個類
                  object ob = Activator.CreateInstance(tp);
                  //得到類中的方法,通過Invoke來觸發方法的調用..
                  MethodInfo mdi = tp.GetMethod("HelloWorldReturn");
                  mdi.Invoke(ob, new object[] { "Hello Lind","OK" });
              }

      回到目錄

      posted @ 2016-12-07 22:10  張占嶺  閱讀(1775)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 白嫩少妇无套内谢视频| 国产欧美精品一区二区三区| 亚洲综合一区国产精品| 色二av手机版在线| 加勒比无码人妻东京热| 蜜桃传媒av免费观看麻豆| 日韩av一区二区精品不卡| 成人污视频| 精品视频不卡免费观看| 中文字幕一卡二卡三卡| 亚洲人成网站在线观看播放不卡 | 中文毛片无遮挡高潮免费| 夜夜爽77777妓女免费看| 91精品国产麻豆国产自产| 国产亚洲人成网站观看| 国产激情艳情在线看视频| 五月天天天综合精品无码| 国产精品普通话国语对白露脸| 亚洲熟妇久久精品| 亚洲一级特黄大片在线观看| 高清无码爆乳潮喷在线观看| 东方av四虎在线观看| 国产专区一va亚洲v天堂| 国偷自产一区二区三区在线视频| 无码精品一区二区三区在线| 中文在线а√天堂| 你懂的亚洲一区二区三区| 亚洲AV高清一区二区三区尤物| 欧美亚洲一区二区三区在线| 久久综合九色综合久桃花| 天天综合天天添夜夜添狠狠添| 毛片内射久久久一区| 国产精品一线天粉嫩av| 欧美性69式xxxx护士| 一区二区福利在线视频| 狠狠躁天天躁中文字幕无码| 久久久国产精品樱花网站| 国产精品中文一区二区| 涩涩爱狼人亚洲一区在线| 桃花岛亚洲成在人线AV| av明星换脸无码精品区|