动态程序集 ILGenerator.Emit

public static void CreateDemo()
        {
            string name = "NameSpaceDemo.CreateClass";
            string FileName = name + ".dll";

            #region step1 创建程序集
            AssemblyName MyAssemblyName = new AssemblyName(name);
            AppDomain MyAppDomain = AppDomain.CurrentDomain;
            AssemblyBuilder MyAssemblyBuilder = MyAppDomain.DefineDynamicAssembly(MyAssemblyName, AssemblyBuilderAccess.RunAndSave);
            #endregion

            #region step2 定义模块
            ModuleBuilder MyModule = MyAssemblyBuilder.DefineDynamicModule(name, FileName);
            #endregion

            #region step3 定义类型
            TypeBuilder MyType = MyModule.DefineType(name,TypeAttributes.Public);
            #endregion

            #region step4 第一属性 name
            FieldBuilder FieldName = MyType.DefineField("name", typeof(string), FieldAttributes.Private);
            FieldBuilder FieldAge = MyType.DefineField("age",typeof(int),FieldAttributes.Private);
            FieldName.SetConstant("0");
            FieldAge.SetConstant(0);
            #endregion

            #region step5 定义属性
            PropertyBuilder PropertyName = MyType.DefineProperty("Name", PropertyAttributes.None, typeof(string), null);
            PropertyBuilder PropertyAge = MyType.DefineProperty("Age", PropertyAttributes.None, typeof(int), null);
            #endregion

            #region step 6 定义name get 和set
            MethodBuilder NameGet = MyType.DefineMethod("get", MethodAttributes.Public|MethodAttributes.SpecialName|MethodAttributes.HideBySig,typeof(string),Type.EmptyTypes);
            ILGenerator ILGNameGet = NameGet.GetILGenerator();
            ILGNameGet.Emit(OpCodes.Ldarg_0);
            ILGNameGet.Emit(OpCodes.Ldfld, FieldName);
            ILGNameGet.Emit(OpCodes.Ret);

            MethodBuilder NameSet = MyType.DefineMethod("set",
                MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig,
                null, new Type[] { typeof(string) });
            ILGenerator ILGNameSet = NameSet.GetILGenerator();
            ILGNameSet.Emit(OpCodes.Ldarg_0);
            ILGNameSet.Emit(OpCodes.Ldarg_1);
            ILGNameSet.Emit(OpCodes.Stfld, FieldName);
            ILGNameSet.Emit(OpCodes.Ret);

            PropertyName.SetGetMethod(NameGet);
            PropertyName.SetSetMethod(NameSet);
            #endregion

            #region step7 定义age get和set

            MethodBuilder AgeGet = MyType.DefineMethod("get", MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig, typeof(int), null);
            ILGenerator ILGAgeGet = AgeGet.GetILGenerator();
            ILGAgeGet.Emit(OpCodes.Ldarg_0);
            ILGAgeGet.Emit(OpCodes.Ldfld, FieldAge);
            ILGAgeGet.Emit(OpCodes.Ret);

            MethodBuilder AgeSet = MyType.DefineMethod("set", 
                MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig,
                null, new Type[] { typeof(int) });
            ILGenerator IGLAgeSet = AgeSet.GetILGenerator();
            IGLAgeSet.Emit(OpCodes.Ldarg_0);
            IGLAgeSet.Emit(OpCodes.Ldarg_1);
            IGLAgeSet.Emit(OpCodes.Stfld, FieldAge);
            IGLAgeSet.Emit(OpCodes.Ret);

            PropertyAge.SetGetMethod(AgeGet);
            PropertyAge.SetSetMethod(AgeSet);
            #endregion

            #region step8 定义构造函数

            ConstructorBuilder CreateClass = MyType.DefineConstructor(MethodAttributes.Public, CallingConventions.HasThis, new Type[] {typeof(string),typeof(int) });

            ILGenerator ILGCreateClass = CreateClass.GetILGenerator();
            ILGCreateClass.Emit(OpCodes.Ldarg_0);
            ILGCreateClass.Emit(OpCodes.Ldarg_1);
            ILGCreateClass.Emit(OpCodes.Stfld,FieldName);
            ILGCreateClass.Emit(OpCodes.Ldarg_0);
            ILGCreateClass.Emit(OpCodes.Ldarg_2);
            ILGCreateClass.Emit(OpCodes.Stfld, FieldAge);
            ILGCreateClass.Emit(OpCodes.Ret);
            #endregion

            MethodBuilder Export = MyType.DefineMethod("Export", MethodAttributes.Public);
            ILGenerator ILGExport = Export.GetILGenerator();
            ILGExport.Emit(OpCodes.Nop);
            ILGExport.Emit(OpCodes.Ldstr, "姓名是{0} 年龄是{1}");
            ILGExport.Emit(OpCodes.Ldarg_0);
            ILGExport.Emit(OpCodes.Call,NameGet);
            ILGExport.Emit(OpCodes.Ldarg_0);
            ILGExport.Emit(OpCodes.Call, AgeGet);
            ILGExport.Emit(OpCodes.Box,typeof(int));
            ILGExport.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string), typeof(object), typeof(object) }));
            ILGExport.Emit(OpCodes.Ret);

            MyType.CreateType();
            MyAssemblyBuilder.Save(FileName);
            

        }

 

posted on 2013-01-06 15:07  R.Ray  阅读(404)  评论(0)    收藏  举报

导航