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

      下載app免費領取會員

      NULL

      ad.jpg

      二次開發教程:C# 動態生成程序集

      發布于:2019-07-24 16:44:30

      網友投稿

      更多

      假設有一個ITest接口,它有兩個實現分別是TestClass1,和TestClass2,這時候如果需要一個TestClass4類但是現有程序里又沒有這個類,就可以在運行時生成一個這樣的類


      這個應該是可以用來實現AOP,


          public interface ITest

          {

              void Run();

          }


          public class TestClass1 : ITest

          {

              public void Run()

              {

                  Console.WriteLine("TestClass1");

              }

          }

          public class TestClass2 : ITest

          {

              public void Run()

              {

                  Console.WriteLine("TestClass2");

              }

          }


          public class TestClass4 : ITest

          {

              public void Run()

              {

                  ITest t1 = new TestClass1();

                  t1.Run();

                  ITest t2 = new TestClass2();

                  t2.Run();

              }

          }




          class Program

          {

              static void Main(string[] args)

              {

                  const string ASSEMBLY_NAME = "MyDynamicAssembly";


                  AppDomain appDomain = AppDomain.CurrentDomain;


                  AssemblyName assemblyName = new AssemblyName(ASSEMBLY_NAME);


                  AssemblyBuilder assemblyBuilder = appDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndCollect);


                  ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule(assemblyName.Name, assemblyName.Name + ".dll");


                  TypeBuilder typeBuilder = moduleBuilder.DefineType("TestClass3", TypeAttributes.Public | TypeAttributes.Class);


                  typeBuilder.AddInterfaceImplementation(typeof(ITest));


                  MethodBuilder methodBuilder = typeBuilder.DefineMethod("Run", MethodAttributes.Public | MethodAttributes.Virtual);


                  ILGenerator iLGenerator = methodBuilder.GetILGenerator();


                  iLGenerator.DeclareLocal(typeof(ITest));


                  iLGenerator.Emit(OpCodes.Nop);

                  iLGenerator.Emit(OpCodes.Newobj, typeof(TestClass1).GetConstructors().First());

                  iLGenerator.Emit(OpCodes.Stloc_0);

                  iLGenerator.Emit(OpCodes.Ldloc_0);

                  iLGenerator.Emit(OpCodes.Callvirt, typeof(ITest).GetMethod("Run"));

                  iLGenerator.Emit(OpCodes.Nop);


                  iLGenerator.Emit(OpCodes.Nop);

                  iLGenerator.Emit(OpCodes.Newobj, typeof(TestClass2).GetConstructors().First());

                  iLGenerator.Emit(OpCodes.Stloc_0);

                  iLGenerator.Emit(OpCodes.Ldloc_0);

                  iLGenerator.Emit(OpCodes.Callvirt, typeof(ITest).GetMethod("Run"));

                  iLGenerator.Emit(OpCodes.Nop);


                  iLGenerator.Emit(OpCodes.Ret);


                  Type type = typeBuilder.CreateType();


                  ITest t = (ITest)Activator.CreateInstance(type);


                  t.Run();


                  Console.ReadLine();

              }

          }

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

      未標題-1.jpg

      上一篇:二次開發教程:Revit開發BuildingEnvelopeAnalyzer

      下一篇:二次開發教程:C# 初探UI Automation

      主站蜘蛛池模板: 一区二区三区日韩| 精品一区二区三区AV天堂| 亚洲一区二区三区偷拍女厕| 红杏亚洲影院一区二区三区| 中文字幕在线观看一区二区| 久久一区二区三区精品| 国产精品制服丝袜一区| 亚洲av无码片vr一区二区三区| 午夜一区二区免费视频| 国产在线观看一区精品| 在线播放国产一区二区三区| 久久亚洲AV午夜福利精品一区| 91福利视频一区| 理论亚洲区美一区二区三区| 久久精品国产一区二区电影| 精品一区二区三区无码免费视频 | 国产成人久久精品麻豆一区| 国产日韩一区二区三区在线观看| 国产香蕉一区二区在线网站| 日本一区二区三区免费高清在线| 国产色情一区二区三区在线播放| 精品国产a∨无码一区二区三区| 福利电影一区二区| 日韩精品视频一区二区三区| 国产精品福利一区| 麻豆高清免费国产一区| 日韩动漫av在线播放一区| 中文字幕一区二区三区在线观看| 日韩AV片无码一区二区不卡| 无码人妻久久一区二区三区| 免费观看日本污污ww网站一区 | 一区二区和激情视频| 亚洲国产一区二区三区| 一区一区三区产品乱码| 国偷自产一区二区免费视频| 国产成人一区二区三区高清| 蜜臀AV在线播放一区二区三区| 无码国产亚洲日韩国精品视频一区二区三区 | 国产一区二区三区影院| 中文无码精品一区二区三区| 国内精品视频一区二区八戒|