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的生成和操作的更多相关文章

  1. MSIL实用指南-Action的生成和调用

    MSIL实用指南-Action的生成和调用 System.Action用于封装一个没有参数没有返回值的方法.这里生成需要Ldftn指令. 下面讲解怎生成如下的程序. class ActionTest ...

  2. MSIL实用指南-闭包的生成和调用

    闭包(Closure)是词法闭包(Lexical Closure)的简称.对闭包的具体定义有很多种说法,这些说法大体可以分为两类: 一种说法认为闭包是符合一定条件的函数,比如参考资源中这样定义闭包:闭 ...

  3. MSIL实用指南-类相关生成

    一.创建class用MethodBuilder的DefineType方法,可以指定父类,得到一个TypeBuilder对象. 二.实现继承接口用TypeBuilder的AddInterfaceImpl ...

  4. MSIL实用指南-this的生成

    C#关键字是非静态方法体内部,用Ldarg_0指代this例子ilGenerator.Emit(OpCodes.Ldarg_0);

  5. MSIL实用指南-生成索引器

    MSIL实用指南-生成索引器 索引器是一种特殊的属性,它有参数的,也有get和set方法,属性名称一般是"Item",并且方法名称一般名称是"get_Item" ...

  6. MSIL实用指南-一维数组的操作

    本篇讲解怎么生成和操作一维数组.各种数组类型创建的步骤是一样的,但是加载和保存步骤有所不同. 一.创建数组所有类型的一维数组创建都是一样的,分三步.1.加载数组长度2.生成指令 Newarr < ...

  7. MSIL实用指南-生成属性

    本篇讲解怎么生成属性,包括get和set方法. 第一步,生成一个字段生成字段用TypeBuilder.DefineField方法.实例代码: FieldBuilder customerNameBldr ...

  8. MSIL实用指南-生成构造函数

    本篇讲解生成构造函数的一些知识,包括创建实例构造函数.静态构造函数.调用父类构造函数. 生成构造函数的方法生成构造函数的方法是TypeBuilder.DefineConstructor(MethodA ...

  9. MSIL实用指南-生成接口

    本篇讲解怎么样生成接口,即interface. 一.创建类型创建一个接口类型依旧用ModuleBuilder的DefineType方法,但是它的第二个参数必须要有TypeAttributes.Inte ...

随机推荐

  1. python列表、元组、字典练习题

    1.元素分类 有如下值集合[11,22,33,44,55,66,77,88,99,90], 将所有大于66的值保存至字典的第一个key中,将小于66值保存至第二个key的值中. li = [11,22 ...

  2. 基于tess4j的图片文字提取

    1.文件结构目录 2.具体实现 ①添加maven依赖 <dependency> <groupId>net.sourceforge.tess4j</groupId> ...

  3. CentOS7 部署K8S集群

    虚拟机:   VMware® Workstation 12 Pro 12.5.9 build-7535481操作系统:CentOS Linux release 7.6.1810 (Core)   部署 ...

  4. JAVA对象实例化方式总结

    JAVA对象实例化的方法 New对象实例 // 直接new对象实例 Productor productor = new Productor(); 反射机制 Java反射机制是在运行状态中,对于任意一个 ...

  5. docker的基本安装和命令详解

    docker的安装 yum install docker-io docker的启动 /bin/systemctl start docker.service docker查找镜像 docker sear ...

  6. 动态开内存(malloc与calloc)

    malloc与calloc 1.函数原型 #include<stdlib.h> void *malloc(unsigned int size);     //申请size字节的内存 voi ...

  7. (13)ASP.NET Core 中的选项模式(Options)

    1.前言 选项(Options)模式是对配置(Configuration)的功能的延伸.在12章(ASP.NET Core中的配置二)Configuration中有介绍过该功能(绑定到实体类.绑定至对 ...

  8. Linux基础管道管理

    一.I/O重定向 标准输入,标准输出,标准错误 file descriptors (FD, 文件描述符或Process I/O channels); 进程使用文件描述符来管理打开的文件 [root@l ...

  9. 个人使用的lilypond第一个模板

    手残非要用lilypond打谱真是…… 可是lilypond又能满足各种细节标记和谱文混排,这是musescore达不到的 所以还是开这个坑,希望能逐渐自己有能力编写自己的音乐教材 个人用Fresco ...

  10. 基于Spring框架应用的权限控制系统的研究和实现

    摘 要: Spring框架是一个优秀的多层J2EE系统框架,Spring本身没有提供对系统的安全性支持.Acegi是基于Spring IOC 和 AOP机制实现的一个安全框架.本文探讨了Acegi安全 ...