亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

秒懂C#通過Emit動態生成代碼

標簽:
C#

首先需要声明一个程序集名称,

 specify a new assembly name<span );

从当前应用程序域获取程序集构造器,

 create assembly builder AppDomain.CurrentDomain3   .DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave);

有几种动态程序集构造访问限制:

  • AssemblyBuilderAccess.Run; 表示程序集可被执行,但不能被保存。  

  • AssemblyBuilderAccess.Save; 表示程序集可被保存,但不能被执行。  

  • AssemblyBuilderAccess.RunAndSave; 表示程序集可被保存并能被执行。

  • AssemblyBuilderAccess.ReflectionOnly; 表示程序集只能用于反射上下文环境中,不能被执行。 

  • AssemblyBuilderAccess.RunAndCollect; 表示程序集可以被卸载并且内存会被回收。

在程序集中构造动态模块,

 create module builder<span );

模块即是代码的集合,一个程序集中可以有多个模块。并且理论上讲,每个模块可以使用不同的编程语言实现,例如C#/VB。
构造一个类型构造器,

 create type builder for a class<span , TypeAttributes.Public);

通过类型构造器定义一个方法,获取方法构造器,获得方法构造器的IL生成器,通过编写IL代码来定义方法功能。


 create method builder typeBuilder.DefineMethod(, MethodAttributes.Static,,); 7   then get the method il generator methodBuilder.GetILGenerator();10   then create the method function);il.Emit(OpCodes.Call, ) }));)); we just read something here, throw it.17 il.Emit(OpCodes.Ret);


创建类型,

 then create the whole class typevar helloKittyClassType = typeBuilder.CreateType();

如果当前程序集是可运行的,则设置一个程序入口,

 set entry point for this assembly<span ));

将动态生成的程序集保存成磁盘文件,

 save assembly<span );

此时,通过反编译工具,将Kitty.exe反编译成代码,


 System; 2  HelloKittyClass{ SayHelloMethod()  {);    Console.ReadLine();  }10 }


运行结果,

完整代码


 System; System.Reflection; System.Reflection.Emit; 4  EmitIntroduction{ Program  {[] args)    { specify a new assembly name);13  create assembly builder AppDomain.CurrentDomain        .DefineDynamicAssembly(assemblyName,           AssemblyBuilderAccess.RunAndSave);18  create module buildervar moduleBuilder =         assemblyBuilder.DefineDynamicModule();23  create type builder for a classvar typeBuilder =         moduleBuilder.DefineType(, TypeAttributes.Public);28  create method builder typeBuilder.DefineMethod(, MethodAttributes.Static,,);35  then get the method il generator methodBuilder.GetILGenerator();38  then create the method function);      il.Emit(OpCodes.Call, (Console).GetMethod() }));      il.Emit(OpCodes.Call, )); we just read something here, throw it.      il.Emit(OpCodes.Ret);48  then create the whole class type typeBuilder.CreateType();51  set entry point for this assembly      assemblyBuilder.SetEntryPoint());55  save assembly);58       Console.WriteLine();      Console.ReadLine();    }  }64 }


點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消