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

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

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

      動(dòng)態(tài)方法與動(dòng)態(tài)代理(上篇)

      2011-06-22 14:57  熬夜的蟲子  閱讀(640)  評(píng)論(0)    收藏  舉報(bào)

      所謂動(dòng)態(tài)方法,是指在程序運(yùn)行階段生成的并且能夠執(zhí)行的方法. 動(dòng)態(tài)方法可以關(guān)聯(lián)到任何已有的模塊(Module)中,作為現(xiàn)有模塊的擴(kuò)展. 動(dòng)態(tài)方法可以訪問模塊中所有類型及其成員.  

      實(shí)現(xiàn)動(dòng)態(tài)方法依賴于:反射發(fā)出(System.Reflection.Emit)、 MSIL語言  

      ?微軟中間語言(MSIL)是將.Net代碼轉(zhuǎn)化為機(jī)器語言的一個(gè)中間過程。它是一種介于高級(jí)語言和匯編語言的偽匯編語言,也是.Net框架的基礎(chǔ),任何高級(jí)應(yīng)用都是在其之上發(fā)展起來的。盡管2.0之后,微軟相繼推出的各個(gè)版本都包含很多新的功能,但MSIL語言卻基本上沒有發(fā)生變化,可謂是“萬變不離其宗”,了解MSIL語言是實(shí)現(xiàn)動(dòng)態(tài)方法的前提,千里之行始于足下
      ?.Net自帶的查看MSIL的工具:ILDASM

        String.ToLower()方法的MSIL代碼

       

      ?基本語法

      操作指令

      說明

      ldarg

      將參數(shù)加載到堆棧頂部

      例如:ldarg.0 將第一個(gè)參數(shù)加載到堆棧

      starg 

      將棧頂元素保存到參數(shù)

      例如:starg.0 將棧頂數(shù)據(jù)保存到第一個(gè)參數(shù)

      ldloc  

      將本地變量加載到堆棧頂部

      例如:ldloc.0 將第一個(gè)變量加載到堆棧

      stloc  

      將棧頂元素保存到本地變量

      例如:stloc.0 將棧頂數(shù)據(jù)保存到第一個(gè)變量

      ldc

      將常量數(shù)字加載到堆棧頂部

      例如:ldc.i4.2 將2加載到堆棧,i4表示int32數(shù)字

      類似的還有用于加載字符串的ldstr、加載和保存字段的ldfld和stfld、加載數(shù)字常量的ldc等等,這些指令執(zhí)行的操作很好記,以ld開頭的就是加載到堆棧,以st開頭的就是從堆棧上取回值

      call

      callvirt

      作用都是調(diào)用方法,但用法有區(qū)別:call用于執(zhí)行非虛函數(shù)或靜態(tài)方法;callvirt用于執(zhí)行虛函數(shù)或?qū)嵗椒ǎ⒁?,這里所說的是一般情況,編譯器為了優(yōu)化也有例外。

       

      ret

      方法返回,如果有返回值,則將其從被調(diào)者堆棧轉(zhuǎn)移到調(diào)用者堆棧頂部

      nop

      空操作

      br

      無條件跳轉(zhuǎn),br.s是br的短格式

      例如:br.s L_0002 無條件跳轉(zhuǎn)到L_0002行

      brtrue

      操作數(shù)非空或非False時(shí)跳轉(zhuǎn)

      例如:brtrue.s L_0002 當(dāng)操作數(shù)為真時(shí)跳轉(zhuǎn)到L_0002行

      brfalse

      操作數(shù)為空、為False或?yàn)?時(shí)跳轉(zhuǎn)

      例如:brfalse.s L_0002 當(dāng)操作數(shù)為假時(shí)跳轉(zhuǎn)到L_0002行

      相關(guān)的跳轉(zhuǎn)語言還有beq、bge、ble和blt等等,執(zhí)行跳轉(zhuǎn)語言后,堆棧元素將被清除,即堆棧頂部不包含元素,b和br都是branch的縮寫  

      add

      將兩個(gè)操作數(shù)相加,結(jié)果放到堆棧頂部

      sub

      將兩個(gè)操作數(shù)相減,結(jié)果放到堆棧頂部

       

      ?反射發(fā)出 

      反射發(fā)出不是將文本形式的C#代碼編譯成DLL

          ?使用IL語言動(dòng)態(tài)的產(chǎn)生可執(zhí)行代碼
          ?相關(guān)類位于System.Reflection.Emit命名空間中
          ?反射發(fā)出創(chuàng)建的是MSIL代碼,而不是產(chǎn)生源代碼
          ?IL操作指令包含在OpCodes中
       
      ?Demo:動(dòng)態(tài)方法演示
          class Program
          {
              
      static void Main(string[] args)
              {
                  Type[] paramTypes 
      = new Type[] { typeof(string) };

                  DynamicMethod hello 
      = new DynamicMethod("Hello"null, paramTypes, typeof(Program).Module);
                  ILGenerator ilGen 
      = hello.GetILGenerator();
                  ilGen.Emit(OpCodes.Ldarg_0);

                  MethodInfo writeLineMethod 
      = typeof(Console).GetMethod("WriteLine"new Type[] { typeof(string) });

                  ilGen.Emit(OpCodes.Call, writeLineMethod);

                  ilGen.Emit(OpCodes.Ret);

                  Action
      <string> invoker = (Action<string>)hello.CreateDelegate(typeof(Action<string>));

                  invoker(
      "你好,我來自于動(dòng)態(tài)方法");
              }
          }

       

      主站蜘蛛池模板: 丝袜无码一区二区三区| 久久91精品牛牛| 国内精品视这里只有精品| 精品偷拍一区二区三区| 久久久久国产一级毛片高清版A| 曲麻莱县| 国产午夜在线观看视频播放| 丰满少妇特黄一区二区三区| 国产精品无遮挡一区二区| 小13箩利洗澡无码视频网站| 最近中文国语字幕在线播放| 国产精品熟女乱色一区二区 | 美女黄18以下禁止观看| 久久人人爽人人爽人人片av| 99riav精品免费视频观看| 日韩一区二区三区女优丝袜| 国产99青青成人A在线| 躁躁躁日日躁| 久久国产自偷自免费一区| 亚洲综合在线日韩av| 亚洲自拍偷拍福利小视频| 国产中文字幕在线精品| 国产精品国产高清国产av| 久久波多野结衣av| gogogo高清在线观看视频中文 | 免费人成在线观看网站| 国产欧美日韩一区二区加勒比| 色噜噜狠狠成人综合| 欧美乱码卡一卡二卡四卡免费| 欧洲免费一区二区三区视频| 黑人好猛厉害爽受不了好大撑| 无码人妻丝袜在线视频| av中文字幕国产精品| 亚洲国产成人精品激情姿源 | 午夜精品国产自在| 国产不卡免费一区二区| 日韩不卡二区三区三区四区| 天天躁夜夜躁狠狠综合| 美腿丝袜亚洲综合第一页| 亚洲一区二区三区久久综合| 国产av午夜精品福利|