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

    下載app免費領(lǐng)取會員

    NULL

    ad.jpg

    二次開發(fā)教程:Emit 循環(huán)

    發(fā)布于:2019-07-24 16:35:03

    網(wǎng)友投稿

    更多

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


    實現(xiàn)


        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 比較的結(jié)果

     

                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 設(shè)置為0

     

                iLGenerator.Emit(OpCodes.Br_S, IL_0012);//跳轉(zhuǎn)到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);//調(diào)用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 的計算結(jié)果賦值給 ldloc.1

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

     

                iLGenerator.Emit(OpCodes.Brtrue_S, IL_0005);// 如果 ldloc.1 則跳轉(zhuǎn)到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;

            }

        }

    本文版權(quán)歸腿腿教學網(wǎng)及原創(chuàng)作者所有,未經(jīng)授權(quán),謝絕轉(zhuǎn)載。

    未標題-1.jpg

    上一篇:二次開發(fā)教程:orm 里使用Emit

    下一篇:二次開發(fā)教程:Emit DynamicMethod

    主站蜘蛛池模板: 亚洲成a人一区二区三区| 一区二区三区午夜| 在线|一区二区三区四区| 无码国产亚洲日韩国精品视频一区二区三区 | 国产探花在线精品一区二区| 色系一区二区三区四区五区| 亚洲乱色熟女一区二区三区蜜臀 | 日韩一区二区三区在线| 一区二区视频在线观看| 国产一区二区三区不卡观| 一区二区三区四区在线视频| 日本一区二区三区不卡在线视频| 91精品一区二区三区在线观看| 国产精品va无码一区二区| 亚洲韩国精品无码一区二区三区| 一区二区高清在线| 一区二区高清视频在线观看| 精品女同一区二区三区在线| 在线视频国产一区| 麻豆精品一区二区综合av| 一区二区免费在线观看| 无码少妇一区二区浪潮av| 一区二区免费国产在线观看| 国产情侣一区二区三区| 精品一区二区三区免费视频| 久久一区二区三区99| 国产无套精品一区二区| 国产无套精品一区二区| 99久久人妻精品免费一区 | 国产精品免费一区二区三区四区| 精品亚洲综合在线第一区| 福利一区二区三区视频在线观看| 好爽毛片一区二区三区四| av无码人妻一区二区三区牛牛 | 中文字幕一区视频一线| 在线观看午夜亚洲一区| 精品无码AV一区二区三区不卡| 国产韩国精品一区二区三区久久| 午夜在线视频一区二区三区 | 国产激情精品一区二区三区| 国产成人精品一区二区三区无码|