struct(结构)是一种值类型,用于将一组相关的信息变量组织为一个单一的变量实体。所有的结构都继承自System.ValueType类,因此是一种值类型,也就是说,struct实例分配在线程的堆栈(stack)上,它本身存储了值,而不包含指向该值的指针。

一、声明struct
和声明class一样,用ModuleBuilder的DefineType方法,但是要求第二个参数是TypeAttributes.Sealed,第三个参数是typeof(ValueType)。
实例:
var typeBuilder = moduleBuilder.DefineType(
"MyStruct,
TypeAttributes.Public ,
typeof(ValueType)
);

二、操作字段、方法、属性
这些和在class生成各成员一致。

三、struct作为参数的相关操作

1.加载struct
和一般加载参数一致,用Ldarg_X类指令

2.加载struct的字段
用Ldarga或Ldarga_S指令把参数地址加载到栈上,再用Ldfld指令加载字段。
Ldarga_S是Ldarga的短格式指令

3.保存到struct的字段
用Ldarga或Ldarga_S指令把参数地址加载到栈上,再用Sdfld指令加载字段。

4.调用struct的方法
用Ldarga或Ldarga_S指令把参数地址加载到栈上,再用Call类指令调用方法。

5.保存struct
和一般保存参数一致,用Starg_X类指令

四、struct作为局部变量的相关操作

1.加载struct
和一般加载局部变量一致,用Ldloc_X类指令

2.加载struct的字段
用Ldloca或Ldloca_S指令把参数地址加载到栈上,再用Ldfld指令加载字段。
Ldloca_S是Ldloca的短格式指令

3.保存到struct的字段
用Ldloca或Ldloca_S指令把参数地址加载到栈上,再用Sdfld指令加载字段。

4.调用struct的方法
用Ldloca或Ldloca_S指令把参数地址加载到栈上,再用Call类指令调用方法。

5.保存struct
和一般保存局部变量一致,用Stloc_X类指令

四、struct作为字段的相关操作

1.加载struct
和一般加载字段一致,先生成加载this,再用Ldfld类指令

2.加载struct的字段
先生成加载this,再用Ldflda指令把加载这个struct字段地址,再用Ldfld指令加载字段。
Ldflda_S是Ldflda的短格式指令

3.保存到struct的字段
先生成加载this,再用Ldflda指令把struct字段地址加载到栈上,再用Sdfld指令加载字段。

4.调用struct的方法
先生成加载this,再用Ldflda指令把struct字段地址加载到栈上,再用Call类指令调用方法。

5.保存struct
和一般保存字段一致,用Stfld类指令

转载于:https://www.cnblogs.com/tkt2016/p/8875324.html

MSIL实用指南-struct的生成和操作相关推荐

  1. MSIL实用指南-生成break和continue

    break和continue本质都是标签的跳转 转载于:https://www.cnblogs.com/tkt2016/p/8807420.html

  2. MSIL实用指南-返回结果

    一个方法体执行完指令后,必须要完成调用并返回,这是要使用Ret指令. Ret指令的详细解释是从当前方法返回,并将返回值(如果存在)从被调用方的计算堆栈推送到调用方的计算堆栈上.就是说如果计算堆栈上没有 ...

  3. MSIL实用指南-比较运算

    数值的比较就是大于.小于.等于.大于等于.小于等于.不等于,它们的运算结果都是布尔值. 大于.小于.等于有直接对应的指令,分别是Cgt.Clt.Ceq. 大于等于.小于等于.不等于没有直接对应的指令, ...

  4. MSIL实用指南-加载和保存参数

    本篇讲解怎么加载和保存参数,以及参数起始序号的确定. 参数的加载 加载参数的指令是Ldarg.Ldarg_S.Ldarg_0.Ldarg_1.Ldarg_2.Ldarg_3. Ldarg_0是加载第0 ...

  5. 《黑客秘笈——渗透测试实用指南(第2版)》目录—导读

    版权 黑客秘笈--渗透测试实用指南(第2版) • 著 [美] Peter Kim 译 孙 勇 责任编辑 傅道坤 • 人民邮电出版社出版发行 北京市丰台区成寿寺路11号 邮编 100164 电子邮件 3 ...

  6. 图解git原理与日常实用指南

    缘起 读了"扔物线"老师的小册<Git 原理详解及实用指南>感觉收获良多,于是想写点东西做一个总结,即加深自己的印象也希望能给社区小伙伴一点帮助,写的不对的地方还请多多 ...

  7. fft 相位谱_FFT和示波器实用指南——深圳零式未来仪器科技

    通用测试仪器 本文讨论了一些重要的FFT特性,解释了如何利用这些特性设置FFT以实现高效的分析. 快速傅里叶变换(FFT)是20世纪70年代微处理器进入商业设计时首次出现的.从昂贵的实验室型号到最便宜 ...

  8. 《黑客秘笈——渗透测试实用指南》—第2章2.3节 外部或内部的主动式信息收集...

    本节书摘来自异步社区<黑客秘笈--渗透测试实用指南>一书中的第2章2.3节 外部或内部的主动式信息收集,作者[美]Peter Kim(彼得 基姆),更多章节内容可以访问云栖社区" ...

  9. Git 原理详解及实用指南

    Git 原理详解及实用指南 什么是版本控制系统(VCS) 很多人认为 Git 难以理解的第一个门槛在于:所谓的「Git 是一个分布式版本控制系统」这句话的具体含义不够清楚.其实分布式版本控制系统(Di ...

  10. Python 无监督学习实用指南:1~5

    原文:Hands-on unsupervised learning with Python 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自[ApacheCN 深度学习 译文集],采用译后编 ...

最新文章

  1. c语言调用shell脚本或命令
  2. shell实例第13讲:从FTP服务器下载文件
  3. 非静态方法可以调用静态变量吗
  4. centos 安装指定版本gc_番外篇 (1) Docker 安装
  5. binary search tree python_二叉查找树(binary search tree)——python实现
  6. C++ primer 1.2 初窥输入输出流
  7. 单碟1.75T 西数14TB充氦硬盘今年上
  8. GIS开源库shapeLib的使用方法
  9. zabbix 脚本安装
  10. 年轻人应该拥有怎样的财富观?
  11. 北京大学生物信息学 (4)序列数据库
  12. php mysql数据库同步_教你怎样在两台MySQL数据库间实现同步
  13. 如何用matlab做参数估计,参数估计的MATLAB实现
  14. GRE 词汇1(前缀)
  15. React脚手架---CRA
  16. 古城钟楼的微博报时是如何实现的?[科普贴]
  17. 用python写一个躲避球十分简单的小游戏
  18. flutter仿微信
  19. python:求出歌手的得分
  20. 《一个投资家的20年》读书笔记

热门文章

  1. MySQL学习(三、分组查询和多表查询)
  2. docker下载地址及 设置自己的阿里云镜像加速器,Kubernetes(K8S) 安装
  3. PHP Opcache(ZendOptimizerPlus)的安装配置详解
  4. Solr 4.10.3 后台管理页面介绍
  5. Navicat连接Mysql报错:Client does not support authentication protocol requested by server;
  6. 阶段3 2.Spring_05.基于XML的IOC的案例1_3 测试基于XML的IOC案例
  7. 2019-05-16mysql忘记密码怎么办
  8. 使用docker+tomcat部署jenkins
  9. My安卓知识6--关于把项目从androidstudio工程转成eclipse工程并导成jar包
  10. SQL Server 数据库性能优化(转载)