完善主體資料,免費贈送VIP會員!
      * 主體類型
      * 企業名稱
      * 信用代碼
      * 所在行業
      * 企業規模
      * 所在職位
      * 姓名
      * 所在行業
      * 學歷
      * 工作性質
      請先選擇行業
      您還可以選擇以下福利:
      行業福利,領完即止!

      下載app免費領取會員

      NULL

      ad.jpg

      二次開發教程:Emit 循環

      發布于:2019-07-24 16:35:03

      網友投稿

      更多

      目的是用Emit 生成一個和TargetMethod(代碼如下) 一樣的方法


      實現


          class Program

          {

              static void Main(string[] args)

              {

       

                  var method = GetTargetMethod();

                  method();

       

                  Console.ReadLine();

              }

       

              static void TargetMethod()

              {

                  for (int i = 0; i < 10; i++)

                  {

                      Console.WriteLine(i);

                  }

              }

       

              static Action GetTargetMethod()

              {

                  DynamicMethod dynamicMethod = new DynamicMethod("test", null, null);

                  var iLGenerator = dynamicMethod.GetILGenerator();

                  iLGenerator.DeclareLocal(typeof(int));//ldloc.0 表示i

                  iLGenerator.DeclareLocal(typeof(bool));//ldloc.1 表示i和10 比較的結果

       

                  var IL_0012 = iLGenerator.DefineLabel();

                  var IL_0005 = iLGenerator.DefineLabel();

       

                  var writeLine = GetWriteLine();

       

                  iLGenerator.Emit(OpCodes.Nop);

                  iLGenerator.Emit(OpCodes.Ldc_I4_0);//0

                  iLGenerator.Emit(OpCodes.Stloc_0);//將 ldloc.0: i 設置為0

       

                  iLGenerator.Emit(OpCodes.Br_S, IL_0012);//跳轉到Label IL_0012

       

                  iLGenerator.MarkLabel(IL_0005);//添加標簽 IL_0005

                  iLGenerator.Emit(OpCodes.Nop);

       

                  iLGenerator.Emit(OpCodes.Ldloc_0);//將 ldloc.0: i 放入計算堆棧

                  iLGenerator.Emit(OpCodes.Call, writeLine);//調用Console.WriteLine 

                  iLGenerator.Emit(OpCodes.Nop);

       

                  iLGenerator.Emit(OpCodes.Ldloc_0);// 將 ldloc.0: i 放入計算堆棧

                  iLGenerator.Emit(OpCodes.Ldc_I4_1);//  將 1 放入計算堆棧

                  iLGenerator.Emit(OpCodes.Add); // 加法

                  iLGenerator.Emit(OpCodes.Stloc_0);// 將計算后的值賦值給ldloc.0: i

       

                  iLGenerator.MarkLabel(IL_0012);//添加標簽 IL_0012

                  iLGenerator.Emit(OpCodes.Ldloc_0);// 

                  iLGenerator.Emit(OpCodes.Ldc_I4_S, 10);// 將 10 放入計算堆棧

                  iLGenerator.Emit(OpCodes.Clt);// 計算 i<10;

                  iLGenerator.Emit(OpCodes.Stloc_1); // 將i<10 的計算結果賦值給 ldloc.1

                  iLGenerator.Emit(OpCodes.Ldloc_1); // 將ldloc.1 放入計算堆棧

       

                  iLGenerator.Emit(OpCodes.Brtrue_S, IL_0005);// 如果 ldloc.1 則跳轉到IL_0005

       

                  iLGenerator.Emit(OpCodes.Ret); // return

       

                  return (Action)dynamicMethod.CreateDelegate(typeof(Action));

              }

              private static MethodInfo GetWriteLine()

              {

                  Type type = typeof(Console);

                  MethodInfo method = type.GetMethod("WriteLine", new Type[] { typeof(int) });

                  return method;

              }

          }

      本文版權歸腿腿教學網及原創作者所有,未經授權,謝絕轉載。

      未標題-1.jpg

      上一篇:二次開發教程:orm 里使用Emit

      下一篇:二次開發教程:Emit DynamicMethod

      主站蜘蛛池模板: 中文字幕日韩丝袜一区| 亚洲国产福利精品一区二区| 亚洲免费一区二区| 国产精品无码一区二区三级| 国产乱码精品一区三上| 欧亚精品一区三区免费| 亚洲一区二区三区四区视频| 国产AV午夜精品一区二区入口| 在线观看一区二区三区视频| 国产精品一区二区不卡| 久久精品亚洲一区二区三区浴池| 亚洲国产精品一区第二页| 日韩人妻无码一区二区三区| 一区二区三区内射美女毛片| 国产成人一区二区三区高清| 精品国产天堂综合一区在线| 在线精品一区二区三区电影| 国精产品999一区二区三区有限| 久久久久久人妻一区精品| 岛国无码av不卡一区二区| 亚洲啪啪综合AV一区| 久久婷婷久久一区二区三区| 手机看片福利一区二区三区| 国产亚洲一区二区三区在线观看| 久久精品一区二区三区中文字幕 | 国产精品视频一区国模私拍| 亚洲综合无码一区二区痴汉| 伊人久久精品无码麻豆一区| 亚洲欧美国产国产一区二区三区| 色婷婷av一区二区三区仙踪林 | 日本免费一区二区三区最新| 国产精品久久亚洲一区二区| 国产福利电影一区二区三区久久久久成人精品综合 | 日韩精品电影一区亚洲| 午夜精品一区二区三区在线观看| 亚洲AV无码一区二区三区国产| 国产精品一区二区av不卡| 久久国产一区二区| 国产乱人伦精品一区二区| 日韩AV片无码一区二区不卡| 波多野结衣高清一区二区三区 |