尔冬橙

博客园 首页 新随笔 联系 订阅 管理
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection.Emit;
using System.Threading;
using System.Reflection;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            AppDomain myDomain = Thread.GetDomain();
            AssemblyName myAsseblyName = new AssemblyName();
            myAsseblyName.Name = "CreatingDynamicAssembliesDemo";

            AssemblyBuilder myAssemblyBuilder = myDomain.DefineDynamicAssembly(myAsseblyName, AssemblyBuilderAccess.RunAndSave);

            ModuleBuilder stuModule = CreateModule(myAssemblyBuilder, myAsseblyName);

            TypeBuilder stuTypeBuilder = CreateStudentTypeBuilder(stuModule);

            CreateFullNameField(stuTypeBuilder);
            CreateFullNameProperty(stuTypeBuilder);

            myAssemblyBuilder.Save(myAsseblyName.Name + ".dll");
        }
        public static ModuleBuilder CreateModule(AssemblyBuilder stuAssemblyBuilder, AssemblyName stuAssemblyName)
        {
            ModuleBuilder myModBuilder = stuAssemblyBuilder.DefineDynamicModule(stuAssemblyName.Name,stuAssemblyName.Name + ".dll");
            return myModBuilder;
        }
        public static TypeBuilder CreateStudentTypeBuilder(ModuleBuilder stuModuleBuilder)
        {
            TypeBuilder stuTypeBuilder = stuModuleBuilder.DefineType("Student", TypeAttributes.Public);
            return stuTypeBuilder;
        }
        public static void CreateFullNameField(TypeBuilder stuTypeBuilder)
        {
            FieldBuilder stuFullNameFieldBuilder = stuTypeBuilder.DefineField("FullName",typeof(string),FieldAttributes.Private);
        }
        public static void CreateFullNameProperty(TypeBuilder stuTypeBuilder)
        {
            PropertyBuilder stuFullNamePropBuilder = stuTypeBuilder.DefineProperty("FullName",PropertyAttributes.None,typeof(string),null);
            MethodAttributes getSetAttr = MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig;
            MethodBuilder stuFullNameGetPropMethodBuilder = stuTypeBuilder.DefineMethod("Get_FullName",getSetAttr,typeof(string),Type.EmptyTypes);
            
            ILGenerator custNameGetIL = stuFullNameGetPropMethodBuilder.GetILGenerator();
            custNameGetIL.Emit(OpCodes.Ldarg_0);
            custNameGetIL.Emit(OpCodes.Ldfld,stuFullNameGetPropMethodBuilder);
            custNameGetIL.Emit(OpCodes.Ret);

            MethodBuilder stuFullNameSetPropMethodBuilder = stuTypeBuilder.DefineMethod("Set_FullName", getSetAttr, null, new Type[] { typeof(string)});

            ILGenerator custNameSetIL = stuFullNameSetPropMethodBuilder.GetILGenerator();
            custNameSetIL.Emit(OpCodes.Ldarg_0);
            custNameSetIL.Emit(OpCodes.Ldarg_1);
            custNameSetIL.Emit(OpCodes.Stfld,stuFullNameSetPropMethodBuilder);
            custNameSetIL.Emit(OpCodes.Ret);

            stuFullNamePropBuilder.SetGetMethod(stuFullNameGetPropMethodBuilder);
            stuFullNamePropBuilder.SetSetMethod(stuFullNameSetPropMethodBuilder);
        }
    }
}

 

posted on 2012-05-31 09:18  尔冬橙  阅读(121)  评论(0编辑  收藏  举报