什么是元编程? 运行时动态创建类型的功能称为元编程。(这个是.NET环境编程全景中的定义)
从学习UML就知道meta-的重要性了,再后来了解到MOF(MetaObjectFacility)就更加着迷这个Meta-。 下图展示了.NET Framework中和元编程有关的类: using System; using System.Reflection; using System.Reflection.Emit; using System.Threading; namespace testMetaProg { /// <summary> /// Class1 的摘要说明。 /// </summary> class Class1 { /// <summary> /// 应用程序的主入口点。 /// </summary> [STAThread] static void Main(string[] args) { // // TODO: 在此处添加代码以启动应用程序 // AssemblyName an = new AssemblyName(); an.Name = "myMetaProg"; AssemblyBuilder ab = Thread.GetDomain().DefineDynamicAssembly(an,AssemblyBuilderAccess.RunAndSave); ModuleBuilder mb = ab.DefineDynamicModule("MetaProgModule","myMetaProg.dll",true); TypeBuilder tb = mb.DefineType("MetaProg.NewType",TypeAttributes.Public); MethodBuilder m = tb.DefineMethod("MetaProgMethod",MethodAttributes.Public,null,null); CreateMethodBody(m); tb.CreateType(); ab.Save("myMetaProg.dll"); Type t = Type.GetType("MetaProg.NewType,myMetaProg",true); Object o = Activator.CreateInstance(t); MethodInfo myMethod = t.GetMethod("MetaProgMethod"); myMethod.Invoke(o,null); myMethod = t.GetMethod("ToString"); Console.WriteLine(myMethod.Invoke(o,null)); } private static void CreateMethodBody(MethodBuilder m) { ILGenerator il = m.GetILGenerator(); il.EmitWriteLine("输出一个新的类型:"); il.Emit(OpCodes.Ret); } } } 生成结果: 思考: 元编程似乎也可以动态直接生成编译后的效果文件了,而Microsoft.CSharp.Compiler也有一个编译类, 可以将输入的cs格式文件编译出Dll的,两者有何区别?那种更好? 下载例子代码 |
|