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 ...
随机推荐
- Spring Cloud 之 Gateway.
一.Gateway 和 Zuul 的区别 Zuul 基于servlet 2.5 (works with 3.x),使用阻塞API.它不支持任何长期的连接,如websocket. Gateway建立在S ...
- jQuery框架操作CSS
3.1 jQuery框架的CSS方法 jQuery框架提供了css方法,我们通过调用该方法传递对应的参数,可以方便的来批量设置标签的CSS样式. 使用JavaScript设置标签的样式相对来说比较麻烦 ...
- $.ajax()在IE9下的兼容性问题
最近在主导一个项目,遇到了一点问题,跟大家分享一下. 最终bug解决方案的链接地址:http://stackoverflow.com/questions/5241088/jquery-call-to- ...
- JS面向对象编程(三):非构造函数的继承
一.什么是"非构造函数"的继承? 现在有一个对象,叫"中国人". var Chinese = { ...
- css清除select默认的样式
select在firefox与chrome的显示是不一样的,我们一般选择通过css清除掉css的默认样式,然后再增添自定义的样式来解决,css我们一般用这么几行代码来清除默认样式: 1 select ...
- 【iOS】iOS main() 简介
C 语言编写的程序,其执行入口都是 main(). 用 Objective-C 语言编写的程序也是这样. main.m 中的代码如下: int main(int argc, char * argv[] ...
- Spring 源码注解
一.@Retention可以用来修饰注解,是注解的注解,称为元注解. Retention注解有一个属性value,是RetentionPolicy类型的,Enum RetentionPolic ...
- JDBC连接池-C3P0连接
JDBC连接池-C3P0连接 c3p0连接池的学习英语好的看英文原版 c3p0 - JDBC3 Connection and Statement Pooling 使用c3p0连接池 三种方 ...
- ceph 初始化函数解析
global_pre_init 预初始化函数,解析ceph.conf配置文件, 初始化定义global_context 和 config的全局变量. 全局预初始化函数 CINIT_FLAG_UNPRI ...
- JDK、JRE、JVM之间的区别和联系
JDK : Java Development ToolKit(Java开发工具包).JDK是整个JAVA的核心,包括了Java运行环境(Java Runtime Envirnment),一堆Java工 ...