当前位置: 首页 > news >正文

【Emit基础】IL定义方法的语法详解

     在IL中,方法的定义语法:
.method  < flags >   < call_conv >   < ret_type >   < name > ( < arg_list > < impl >
{
  
< method_body >
}


一.Flags部分可设置
1.可访问性

  • privatescope: 该方法不能被引用。
  • private: 该方法只能被自身及其嵌套类型调用。
  • famandassem: 该方法只能被当前程序集内部的继承类型调用。(internal and protected)
  • assembly: 该方法只能被程序集内部成员调用。
  • family: 该方法只能被继承类型调用。
  • famorassem: 该方法可以被程序集内部成员或外部继承类型调用。(internal or protected)
  • public: 公共方法。
2. Contract
  • static: 静态方法。
  • final: 不能被 override 的方法。
  • virtual: 虚方法,不能和 static 同时使用。
  • hidebysig: 该方法对继承类型隐藏。该标记仅提供给编译器使用,但会被 CLR 忽略。
3. Vitual method table (v-table) control flags
  • newslot: 必须和 virtual 一起使用,添加该关键字的虚方法不会 override 基类中同名(含签名)虚方法,而是在 v-table 中创建一个新槽(new slot)。
4. Implementation
  • abstract: 抽象方法,不提供实现代码。其 RVA = 0,任何拥有抽象方法的类型必须添加 abstract 成为抽象类型。
  • specialname: 该方法名有特殊含义,如 .cctor、.ctor 等。
  • pinvokeimpl: 该方法是非托管方法,通过 P/Invoke 封装调用。
5. Reserved
  • rtspecialname: 该方法拥有 CLR 内部使用的特殊名称,必须和 specialname 一起使用。
二. Implementation Flags

1. Code type
  • cil: 该方法由 CIL (common intermediate language) 实现。(默认)
  • native: 该方法由 native code 实现。
  • runtime: 该方法由 CLR 自动生成。只有 mscorlib.dll 中的某些方法带有此标记。
2. Code management
  • managed: 托管代码。(默认)
  • unmanaged: 非托管代码,必须和 native 一起使用。
3. Implementation and interoperability
  • internalcall: 内部使用标记。
  • synchronized: 指示 JIT 自动为其插入同步代码,以保证多线程调用安全。在 C# 中我们为方法添加 [MethodImpl(MethodImplOptions.Synchronized)] 特性时,编译器就会为该方法添加该标记。对于实例方法而言,自动插入代码会锁定实例对象引用;而静态方法,会锁定其所在类型的静态类型对象(System.Type)。
  • noinlining: 禁止内联(inline)调用。

 

相关文章:

  • Cocos2dx 学习笔记整理----在项目中使用图片(三)
  • inittab文件解析
  • notes
  • Windows下如何使用GCC
  • UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position xxx ordinal
  • cxGrid, 和AfterScroll
  • Reset the default deployment target in Windows Phone Developer Tools
  • DataTable行列转换
  • html的a标签display:block之后文字竖直居中
  • 买了一个USB无线网卡
  • 一分钟制作U盘版BT3 - 有图滴儿 bt3破解教程
  • 假装
  • html与html5的一些区别
  • 无盘教程
  • Entity Framework – Update Model From Database, Part 2
  • [LeetCode] Wiggle Sort
  • Apache的80端口被占用以及访问时报错403
  • Debian下无root权限使用Python访问Oracle
  • eclipse的离线汉化
  • Git学习与使用心得(1)—— 初始化
  • Gradle 5.0 正式版发布
  • JavaScript类型识别
  • javascript数组去重/查找/插入/删除
  • Java超时控制的实现
  • js正则,这点儿就够用了
  • LeetCode29.两数相除 JavaScript
  • Linux快速复制或删除大量小文件
  • mysql外键的使用
  • 基于web的全景—— Pannellum小试
  • 前端js -- this指向总结。
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 深入浏览器事件循环的本质
  • 树莓派 - 使用须知
  • 在Unity中实现一个简单的消息管理器
  • 阿里云服务器购买完整流程
  • 我们雇佣了一只大猴子...
  • ​ssh免密码登录设置及问题总结
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • # Panda3d 碰撞检测系统介绍
  • #Ubuntu(修改root信息)
  • #每日一题合集#牛客JZ23-JZ33
  • #每天一道面试题# 什么是MySQL的回表查询
  • (52)只出现一次的数字III
  • (二)hibernate配置管理
  • (强烈推荐)移动端音视频从零到上手(下)
  • (一)插入排序
  • (转)http协议
  • ../depcomp: line 571: exec: g++: not found
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • /run/containerd/containerd.sock connect: connection refused
  • [ 蓝桥杯Web真题 ]-Markdown 文档解析
  • [ 隧道技术 ] 反弹shell的集中常见方式(二)bash反弹shell
  • [1]-基于图搜索的路径规划基础
  • [22]. 括号生成
  • [AIGC] 使用Curl进行网络请求的常见用法