MSIL实用指南-struct的生成和操作
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类指令
MSIL实用指南-struct的生成和操作的更多相关文章
- MSIL实用指南-Action的生成和调用
MSIL实用指南-Action的生成和调用 System.Action用于封装一个没有参数没有返回值的方法.这里生成需要Ldftn指令. 下面讲解怎生成如下的程序. class ActionTest ...
- MSIL实用指南-闭包的生成和调用
闭包(Closure)是词法闭包(Lexical Closure)的简称.对闭包的具体定义有很多种说法,这些说法大体可以分为两类: 一种说法认为闭包是符合一定条件的函数,比如参考资源中这样定义闭包:闭 ...
- MSIL实用指南-类相关生成
一.创建class用MethodBuilder的DefineType方法,可以指定父类,得到一个TypeBuilder对象. 二.实现继承接口用TypeBuilder的AddInterfaceImpl ...
- MSIL实用指南-this的生成
C#关键字是非静态方法体内部,用Ldarg_0指代this例子ilGenerator.Emit(OpCodes.Ldarg_0);
- MSIL实用指南-生成索引器
MSIL实用指南-生成索引器 索引器是一种特殊的属性,它有参数的,也有get和set方法,属性名称一般是"Item",并且方法名称一般名称是"get_Item" ...
- MSIL实用指南-一维数组的操作
本篇讲解怎么生成和操作一维数组.各种数组类型创建的步骤是一样的,但是加载和保存步骤有所不同. 一.创建数组所有类型的一维数组创建都是一样的,分三步.1.加载数组长度2.生成指令 Newarr < ...
- MSIL实用指南-生成属性
本篇讲解怎么生成属性,包括get和set方法. 第一步,生成一个字段生成字段用TypeBuilder.DefineField方法.实例代码: FieldBuilder customerNameBldr ...
- MSIL实用指南-生成构造函数
本篇讲解生成构造函数的一些知识,包括创建实例构造函数.静态构造函数.调用父类构造函数. 生成构造函数的方法生成构造函数的方法是TypeBuilder.DefineConstructor(MethodA ...
- MSIL实用指南-生成接口
本篇讲解怎么样生成接口,即interface. 一.创建类型创建一个接口类型依旧用ModuleBuilder的DefineType方法,但是它的第二个参数必须要有TypeAttributes.Inte ...
随机推荐
- 简单粗暴的方式解决eclipse下安装STS失败的问题
直接去Spring官网下载,spring定制eclipse https://spring.io/tools
- zabbix 支持的主要监控方式
zabbix 支持的主要监控方式 一.zabbix支持的主要监控方式: zabbix主要Agent,Trapper,SNMP,JMX,IPMI这几种监控方式,本文章主要通过监控理论和实际操作测试等方式 ...
- 將Python打包成 exe可执行文件
利用Python寫了一個小腳本想要傳給使用Windows但沒有裝Python的朋友執行,這時候就可以利用將檔案包裝成exe檔案,讓沒有Python的朋友也可以執行.本篇將介紹利用套件「PyInstal ...
- T-SQL 恢复数据库
USE master GO ALTER DATABASE DEMO SET SINGLE_USER GO ALTER DATABASE DEMO SET EMERGENCY GO DBCC CHECK ...
- TIJ学习--RTTI(Runtime-Time Type Identification)
TIJ学习--RTTI(Runtime-Time Type Identification) RTTI 运行时类型检查机制 获取一个类的Class引用的三种方法 class TestClass{} Te ...
- Python版:Selenium2.0之WebDriver学习总结_实例1
Python版:Selenium2.0之WebDriver学习总结_实例1 快来加入群[python爬虫交流群](群号570070796),发现精彩内容. 实属转载:本人看的原文地址 :http:/ ...
- 【Android】Fresco 初次使用遇到的坑
初次使用开源框架 Fresco,结果遇到了坑,被虐了半下午--暂且记下. 下面的错误 android.view.InflateException: Binary XML file line #** 报 ...
- Mysql执行过程总结
总分三个阶段:Sql的解析,执行和结果获取阶段. 如下图,展开相熟.
- 我的ubuntu kylin中mentohust的使用历程
1首先下载mentohus 最新版下载(包括源码):http://code.google.com/p/mentohust/downloads/list 2打开终端(Ctrl+Alt+T) 输入sudo ...
- strus 上传文件
(1) action代码 package comSys.struts.articleManager; import java.io.File; import java.io.FileInputStre ...