反射发出一

反射用来获取程序集及其相关信息。

反射发出是在运行时动态构造元数据和MSIL语言还可生产PE文件。

使用反射发出的步骤基本是固定的 ,用HELLO  WORD 做开始

        public void BuildeMthod()
        {
            //1.构建程序集
            AppDomain myDomain = AppDomain.CurrentDomain;
            AssemblyName asmName = new AssemblyName();
            asmName.Name = "MyDom";
            AssemblyBuilder myAsmBuilder = myDomain.DefineDynamicAssembly(
                                           asmName,
                                           AssemblyBuilderAccess.RunAndSave);

            //模块和类型
            ModuleBuilder myModule = myAsmBuilder.DefineDynamicModule("MyDom",
                                                                "MyDom.dll");
            //类型
            TypeBuilder myTypeBld = myModule.DefineType("MyDomType",
                                                        TypeAttributes.Public);

            //方法 
            MethodBuilder myMthdBld = myTypeBld.DefineMethod(
                                           "SampleC",
                                           MethodAttributes.Public |
                                           MethodAttributes.Static
                                           );

            //生成MSIL语言
            ILGenerator ILout = myMthdBld.GetILGenerator();
            ILout.Emit(OpCodes.Nop);
            ILout.Emit(OpCodes.Ldstr, "Hello World!");
            MethodInfo mi = typeof(System.Console).GetMethod("Write", new Type[] { typeof(string) });
            ILout.Emit(OpCodes.Call,mi);
            ILout.Emit(OpCodes.Nop);
            ILout.Emit(OpCodes.Ret);

            Type myType = myTypeBld.CreateType();

            myAsmBuilder.Save("MyDom.dll");

            MethodInfo myMthdInfo = myType.GetMethod("SampleC");
            myMthdInfo.Invoke(myType,null);

        }

 

posted @ 2014-10-13 09:49  坚硬的鸡蛋  阅读(149)  评论(0编辑  收藏  举报