博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
元编程技术和动态编译
阅读量:7097 次
发布时间:2019-06-28

本文共 1677 字,大约阅读时间需要 5 分钟。

什么是元编程?

运行时动态创建类型的功能称为元编程。(这个是中的定义)


从学习UML就知道meta-的重要性了,再后来了解到MOF(MetaObjectFacility)就更加着迷这个Meta-。

Meta-  在...之中... 对于想真正了解一个Framework,了解它的Meta东西是十分重要的。不管任何一个Framework,肯定存在着它自己的MetaData的,.NET作为一个Framework自然也存在好多元数据,我们编写应用程序中如果可以灵活的运用元编程技术,肯定可以使我们的程序更加灵活,高效甚至自我生成。

下图展示了.NET Framework中和元编程有关的类:

metaprog1.JPG
例如下面这个例子直接生成一个Dll,并且调用这个Dll中的动态方法:

None.gif
using System;
None.gif
using System.Reflection;
None.gif
using System.Reflection.Emit;
None.gif
using System.Threading;
None.gif
None.gif
namespace testMetaProg
ExpandedBlockStart.gif {
ExpandedSubBlockStart.gif    
///
 
<summary>
InBlock.gif    
///
 Class1 的摘要说明。
ExpandedSubBlockEnd.gif    
///
 
</summary>
InBlock.gif    
class Class1
ExpandedSubBlockStart.gif    {
ExpandedSubBlockStart.gif        
///
 
<summary>
InBlock.gif        
///
 应用程序的主入口点。
ExpandedSubBlockEnd.gif        
///
 
</summary>
InBlock.gif        [STAThread]
InBlock.gif        
static 
void Main(
string[] args)
ExpandedSubBlockStart.gif        {
InBlock.gif            
//
InBlock.gif            
//
 TODO: 在此处添加代码以启动应用程序
InBlock.gif            
//
InBlock.gif
            AssemblyName an = 
new AssemblyName();
InBlock.gif            an.Name = "myMetaProg";
InBlock.gif            AssemblyBuilder ab = Thread.GetDomain().DefineDynamicAssembly(an,AssemblyBuilderAccess.RunAndSave);
InBlock.gif            ModuleBuilder mb = ab.DefineDynamicModule("MetaProgModule","myMetaProg.dll",
true);
InBlock.gif            TypeBuilder tb = mb.DefineType("MetaProg.NewType",TypeAttributes.Public);
InBlock.gif            MethodBuilder m = tb.DefineMethod("MetaProgMethod",MethodAttributes.Public,
null,
null);
InBlock.gif
InBlock.gif            CreateMethodBody(m);
InBlock.gif            tb.CreateType();
InBlock.gif            ab.Save("myMetaProg.dll");
InBlock.gif            
InBlock.gif            Type t = Type.GetType("MetaProg.NewType,myMetaProg",
true);
InBlock.gif            Object o = Activator.CreateInstance(t);
InBlock.gif            MethodInfo myMethod = t.GetMethod("MetaProgMethod");
InBlock.gif            myMethod.Invoke(o,
null);
InBlock.gif            myMethod = t.GetMethod("ToString");
InBlock.gif            Console.WriteLine(myMethod.Invoke(o,
null));
InBlock.gif            
ExpandedSubBlockEnd.gif        }
InBlock.gif
InBlock.gif        
private 
static 
void CreateMethodBody(MethodBuilder m)
ExpandedSubBlockStart.gif        {
InBlock.gif           ILGenerator il = m.GetILGenerator();
InBlock.gif           il.EmitWriteLine("输出一个新的类型:");
InBlock.gif           il.Emit(OpCodes.Ret);
ExpandedSubBlockEnd.gif        }
ExpandedSubBlockEnd.gif    }
ExpandedBlockEnd.gif}
None.gif

生成结果:

metaprog2.JPG
用ILDASM看生成的Dll,发现确实是个有效的CLR文件:
metaprog3.JPG
其中MetaProgMethod的方法对应的IL如下:
metaprog4.JPG

本文转自风前絮~~博客园博客,原文链接:http://www.cnblogs.com/windsails/archive/2004/09/07/40754.html,如需转载请自行联系原作者

你可能感兴趣的文章
【转】vs2010快捷键;sql server 2008快捷;IE9快捷键
查看>>
win7中如何解决“该项不适用于在指定状态下使用”
查看>>
stack括号匹配检验
查看>>
mongodb 之聚合框架--aggregate
查看>>
多线程断点续传下载
查看>>
【CentOS 7.1】Failed to set locale
查看>>
我的友情链接
查看>>
linux把一列数据转换成多列
查看>>
『同余乘法逆元』
查看>>
使用pexpect自动登录ssh,interact之后shell窗口过小的问题
查看>>
Dorado IDE
查看>>
KAFKA集群搭建
查看>>
MapReduce作业性能调优参数
查看>>
nginx访问限制模块limit_conn_zone 和limit_req_zone配置使用详解
查看>>
gtags运行时报错 input buffer overflow 解决办法
查看>>
PAT 2-09. 装箱问题模拟(20)
查看>>
思科SG300,SG500,SF300,SF500系统默认VLAN解析
查看>>
vi速查
查看>>
挨踢项目求生法则——测试篇
查看>>
mysql找回管理员密码
查看>>