星空网 > 软件开发 > ASP.net

基础才是重中之重~Emit动态构建方法(参数和返回值)

回到目录

对于Emit我们知道它的可以动态构建程序集,类型,方法,属性等,或者说只要手动使用C#创建的东西使用Emit也都可以动态创建它们,Emit由于它的特别之处,所以在很多领域得到了广泛的应用,像最近比较火的AOP技术,它最核心的功能就是方法拦截了,我们使用Emit也是可以实现方法拦截功能的,详细可以看大叔这篇文章《Lind.DDD.Aspects通过Plugins实现方法的动态拦截~Lind里的AOP》。

有参数,没有返回值的方法构建与调用

    [TestMethod]    public void BulidMethod()    {      //得到当前的应用程序域      AppDomain appDm = AppDomain.CurrentDomain;      //初始化AssemblyName的一个实例      AssemblyName an = new AssemblyName();      //设置程序集的名称      an.Name = "EmitLind";      //动态的在当前应用程序域创建一个应用程序集      AssemblyBuilder ab = appDm.DefineDynamicAssembly(an, AssemblyBuilderAccess.Run);      //动态在程序集内创建一个模块      ModuleBuilder mb = ab.DefineDynamicModule("EmitLind");      //动态的在模块内创建一个类      TypeBuilder tb = mb.DefineType("HelloEmit", TypeAttributes.Public | TypeAttributes.Class);      //动态的为类里创建一个方法      MethodBuilder mdb = tb.DefineMethod("HelloWord", MethodAttributes.Public, null, new Type[] { typeof(string) });      //得到该方法的ILGenerator      ILGenerator ilG = mdb.GetILGenerator();      ilG.Emit(OpCodes.Ldstr, "Hello:{0}");      //加载传入方法的参数到堆栈      ilG.Emit(OpCodes.Ldarg_1);      //调用Console.WriteLine方法,输出传入的字符      ilG.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string), typeof(string) }));      ilG.Emit(OpCodes.Ret);      //创建类的Type对象      Type tp = tb.CreateType();      //实例化一个类      object ob = Activator.CreateInstance(tp);      //得到类中的方法,通过Invoke来触发方法的调用..      MethodInfo mdi = tp.GetMethod("HelloWord");      mdi.Invoke(ob, new object[] { "Hello Lind" });    }

有参数,同时有返回值的方法构建与调用

    public void BulidMethodRet()    {      //得到当前的应用程序域      AppDomain appDm = AppDomain.CurrentDomain;      //初始化AssemblyName的一个实例      AssemblyName an = new AssemblyName();      //设置程序集的名称      an.Name = "EmitLind";      //动态的在当前应用程序域创建一个应用程序集      AssemblyBuilder ab = appDm.DefineDynamicAssembly(an, AssemblyBuilderAccess.Run);      //动态在程序集内创建一个模块      ModuleBuilder mb = ab.DefineDynamicModule("EmitLind");      //动态的在模块内创建一个类      TypeBuilder tb = mb.DefineType("HelloEmit", TypeAttributes.Public | TypeAttributes.Class);           //动态的为类里创建一个方法      MethodBuilder mdb = tb.DefineMethod(        "HelloWorldReturn",        MethodAttributes.Public,        typeof(string),        new Type[] { typeof(string), typeof(string) });      //得到该方法的ILGenerator      ILGenerator ilG = mdb.GetILGenerator();      ilG.Emit(OpCodes.Ldstr, "你好:{0}-{1}");      //加载传入方法的参数到堆栈      ilG.Emit(OpCodes.Ldarg_1);       ilG.Emit(OpCodes.Ldarg_2);      //调用Console.WriteLine方法,输出传入的字符      ilG.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string), typeof(string) ,typeof(string)}));      // ilG.Emit(OpCodes.Pop);//加这个就有问题了      //返回值部分      LocalBuilder local = ilG.DeclareLocal(typeof(string));      ilG.Emit(OpCodes.Ldstr, "Return Value:{0}");      ilG.Emit(OpCodes.Ldarg_1);      ilG.Emit(OpCodes.Call, typeof(string).GetMethod("Format", new Type[] { typeof(string), typeof(string) }));      ilG.Emit(OpCodes.Stloc_0, local);      ilG.Emit(OpCodes.Ldloc_0, local);      ilG.Emit(OpCodes.Ret);      //创建类的Type对象      Type tp = tb.CreateType();      //实例化一个类      object ob = Activator.CreateInstance(tp);      //得到类中的方法,通过Invoke来触发方法的调用..      MethodInfo mdi = tp.GetMethod("HelloWorldReturn");      mdi.Invoke(ob, new object[] { "Hello Lind","OK" });    }

回到目录




原标题:基础才是重中之重~Emit动态构建方法(参数和返回值)

关键词:

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

优势巨大! Lazada力图主导东南亚电商市场:https://www.ikjzd.com/articles/20351
选品新方向:性价比高,适合小卖家的两个类目推荐!:https://www.ikjzd.com/articles/20355
降低亚马逊FBA费用的3种方法,2019了卖家还不知道?:https://www.ikjzd.com/articles/20356
6大策略帮你实现Google广告利润最大化:https://www.ikjzd.com/articles/20357
黑龙江全力建设、运营对俄跨境电商物流通道:https://www.ikjzd.com/articles/20359
亚马逊赶走跟卖实操:https://www.ikjzd.com/articles/20360
小米SU7的不甘心全写进了 “周边”的商品链接里 :https://www.kjdsnews.com/a/1836549.html
10天涨粉300+万 “王婆说媒”凭什么一夜爆红? :https://www.kjdsnews.com/a/1836550.html
相关文章
我的浏览记录
最新相关资讯
海外公司注册 | 跨境电商服务平台 | 深圳旅行社 | 东南亚物流