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

      下載app免費領取會員

      NULL

      ad.jpg

      二次開發(fā)教程:Hello Emit

      發(fā)布于:2019-07-24 16:37:06

      網(wǎng)友投稿

      更多

      相關類如下,目標是用Emit生成一個Writer類,并返回一個IWriter接口,使用接口調(diào)用


      public interface IWriter

      {

      void Write(string msg, string msg1);

      }

       

      public class Writer: IWriter

      {

      public  void Write(string msg,string msg1)

      {

      string ex = "ex";

      string str = msg + msg1 + ex;

      Console.WriteLine(str);

      }

      }

      實現(xiàn)如下:


      class Program

      {

      static void Main(string[] args)

      {

      IWriter writer = GetWriter();

      writer.Write("test1", "test2");

      Console.ReadLine();

      }

       

      private static IWriter GetWriter()

      {

      var assemblyName = new AssemblyName("DynamicAssembly");

       

      var assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName,

      AssemblyBuilderAccess.RunAndCollect);

      var moduleBuilder = assemblyBuilder.DefineDynamicModule(assemblyName.Name);

       

       

      var typeBuilder = moduleBuilder.DefineType("DefaultType", TypeAttributes.Public| TypeAttributes.Class);

       

      typeBuilder.AddInterfaceImplementation(typeof(IWriter));

       

      Type strType = typeof(string);

       

      var methodBuilder = typeBuilder.DefineMethod("Write", MethodAttributes.Public| MethodAttributes.Virtual,typeof(void),new Type[]{ strType , strType });

       

      methodBuilder.DefineParameter(1, ParameterAttributes.In, "msg");//Ldarg_1

       

      methodBuilder.DefineParameter(2, ParameterAttributes.In, "msg1");//Ldarg_1

       

      var iLGenerator = methodBuilder.GetILGenerator();

       

      iLGenerator.DeclareLocal(typeof(string));//Ldloc_0

      iLGenerator.DeclareLocal(typeof(string));//Ldloc_1

       

      ///https://docs.microsoft.com/en-us/dotnet/api/system.reflection.emit.opcodes.ldarg_1?view=netframework-4.7.2

       

      iLGenerator.Emit(OpCodes.Nop);

      iLGenerator.Emit(OpCodes.Ldstr,"ex");//Pushes a new object reference to a string literal stored in the metadata.

      iLGenerator.Emit(OpCodes.Stloc_0); // Pops the current value from the top of the evaluation stack and stores it in a the local variable list at index 0.

        // 上一句是將ex 放到棧里(?),這句從棧里取出來賦值給 Ldloc_0

      iLGenerator.Emit(OpCodes.Ldarg_1);

      iLGenerator.Emit(OpCodes.Ldarg_2);

      iLGenerator.Emit(OpCodes.Ldloc_0);

      iLGenerator.Emit(OpCodes.Call, GetStringConcat());//計算結(jié)果保存在了棧里(?)

       

      iLGenerator.Emit(OpCodes.Stloc_1);//將計算結(jié)果取出來賦值給 Ldloc_1

      iLGenerator.Emit(OpCodes.Ldloc_1);//將 Ldloc_1 放入棧

       

      iLGenerator.Emit(OpCodes.Call, GetWriteLine());

       

      iLGenerator.Emit(OpCodes.Nop);

      iLGenerator.Emit(OpCodes.Ret);

       

      var type = typeBuilder.CreateType();

       

      return (IWriter)Activator.CreateInstance(type);

      }

       

      private static MethodInfo GetStringConcat()

      {

      Type type = typeof(string);

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

      return method;

      }

      private static MethodInfo GetWriteLine()

      {

      Type type = typeof(Console);

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

      return method;

      }

      }

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

      未標題-1.jpg

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

      下一篇:二次開發(fā)教程:研究下WPF 數(shù)據(jù)binding 原理

      主站蜘蛛池模板: 91在线精品亚洲一区二区| 加勒比无码一区二区三区| 伊人色综合网一区二区三区| 色狠狠AV一区二区三区| 久久精品国产第一区二区三区| 日本精品一区二区三区在线观看| 伊人色综合视频一区二区三区 | 国产福利电影一区二区三区久久久久成人精品综合| 欧美激情国产精品视频一区二区 | 国产一区二区三区久久精品| 伊人久久精品一区二区三区| 国产精品区一区二区三在线播放| 日本精品一区二区在线播放| 国产精品福利一区二区久久| 国产av成人一区二区三区| 国产在线一区二区三区在线| 精品亚洲AV无码一区二区三区 | 日韩精品一区二三区中文| 国产福利91精品一区二区| 国产婷婷色一区二区三区| 理论亚洲区美一区二区三区| 中文字幕国产一区| 伦理一区二区三区| 中文字幕一区二区人妻| 中日av乱码一区二区三区乱码| 亚洲美女高清一区二区三区| 国产91精品一区二区麻豆亚洲| 国产成人精品久久一区二区三区av| 国产免费av一区二区三区| 国产精品熟女视频一区二区| 国产亚洲福利精品一区二区| 无码人妻精品一区二 | 2020天堂中文字幕一区在线观 | 国产在线不卡一区二区三区| 台湾无码AV一区二区三区| 国产精品日本一区二区不卡视频 | 免费无码毛片一区二区APP| 男插女高潮一区二区| 日韩精品一区二区三区国语自制| 国产人妖在线观看一区二区| 大伊香蕉精品一区视频在线|