完善主體資料,免費贈送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无码一区二区三区| 无码人妻精品一区二区三18禁| 中文字幕久久亚洲一区| 精品福利一区二区三区精品国产第一国产综合精品 | 无码一区二区三区老色鬼| 中文字幕一区二区三区有限公司| 视频一区在线播放| 韩国精品一区视频在线播放| 久久精品无码一区二区三区不卡| 亚洲国产视频一区| 亚洲AV成人一区二区三区在线看| 69福利视频一区二区| 亚洲精品一区二区三区四区乱码| 精品无码人妻一区二区三区| 麻豆天美国产一区在线播放| 日韩精品无码一区二区中文字幕| 无码乱人伦一区二区亚洲一| 日韩精品无码一区二区三区 | 亚洲夜夜欢A∨一区二区三区 | AV无码精品一区二区三区| 国产精品一区二区久久精品| 久久久国产精品无码一区二区三区| 亚洲AV网一区二区三区| 一区二区三区内射美女毛片| 久久se精品一区二区影院| 国产伦理一区二区| 亚洲一区中文字幕在线电影网|