MSIL实用指南-字段的加载和保存
字段有静态字段和非静态字段之分,它们的加载保存指令也是不一样的,并且非静态字段要生成this。
静态字段的加载
加载静态字段的指令是Ldsfld。
ilGenerator.Emit(OpCodes.Ldsfld, <FieldBuilder>);
实际例子
ilGenerator.Emit(OpCodes.Ldsfld, areaFieldBuilder);
ilGenerator.Emit(OpCodes.Call, writeStringLineMethod);
静态字段的保存
保存静态字段的指令是Stsfld。
ilGenerator.Emit(OpCodes.Stsfld, <FieldBuilder>);
实际例子
ilGenerator.Emit(OpCodes.Ldstr,"New York");
ilGenerator.Emit(OpCodes.Stsfld, areaFieldBuilder);
实例字段的加载
加载静态字段的指令是Ldsfld,必须要在第一步生成Ldarg_0指令。
ilGenerator.Emit(OpCodes.Ldsfld, <FieldBuilder>);
实际例子
ilGenerator.Emit(OpCodes.Ldarg_0);//生成this
ilGenerator.Emit(OpCodes.Ldfld, areaFieldBuilder);
ilGenerator.Emit(OpCodes.Call, writeStringLineMethod);
实例字段的保存
保存静态字段的指令是Stsfld,必须要在第一步生成Ldarg_0指令。
ilGenerator.Emit(OpCodes.Stsfld, <FieldBuilder>);
实际例子
ilGenerator.Emit(OpCodes.Ldarg_0);//生成this
ilGenerator.Emit(OpCodes.Ldstr, "Tom");
ilGenerator.Emit(OpCodes.Stfld, nameFieldBuilder);
一个完整的程序如下
using System;
using System.Reflection;
using System.Reflection.Emit; namespace LX1_ILDemo
{
class Demo09_FieldLoadStorm
{
static string binaryName = "Demo09_FieldLoadStorm.dll";
static string namespaceName = "LX1_ILDemo";
static string typeName = "FieldLoadStorm"; static AssemblyBuilder assemblyBuilder;
static ModuleBuilder moduleBuilder;
static TypeBuilder typeBuilder;
static MethodBuilder testMethod;
static ILGenerator ilGenerator; static void Emit_IL()
{
/* protected string Area; */
FieldBuilder areaFieldBuilder = typeBuilder.DefineField("Area", typeof(string),
FieldAttributes.Public | FieldAttributes.Static); /* private string Name; */
FieldBuilder nameFieldBuilder = typeBuilder.DefineField("Name", typeof(string), FieldAttributes.Public); testMethod = typeBuilder.DefineMethod("Test", MethodAttributes.Public, typeof(void), new Type[] { });
ilGenerator = testMethod.GetILGenerator(); MethodInfo writeStringLineMethod = typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) });
ilGenerator.Emit(OpCodes.Ldstr,"New York");
ilGenerator.Emit(OpCodes.Stsfld, areaFieldBuilder); ilGenerator.Emit(OpCodes.Ldsfld, areaFieldBuilder);
ilGenerator.Emit(OpCodes.Call, writeStringLineMethod); ilGenerator.Emit(OpCodes.Ldarg_0);//生成this
ilGenerator.Emit(OpCodes.Ldstr, "Tom");
ilGenerator.Emit(OpCodes.Stfld, nameFieldBuilder); ilGenerator.Emit(OpCodes.Ldarg_0);//生成this
ilGenerator.Emit(OpCodes.Ldfld, areaFieldBuilder);
ilGenerator.Emit(OpCodes.Call, writeStringLineMethod); ilGenerator.Emit(OpCodes.Ret); } public static void Generate()
{
InitAssembly(); typeBuilder = moduleBuilder.DefineType(namespaceName + "." + typeName, TypeAttributes.Public);
Emit_IL(); SaveAssembly();
Console.WriteLine("生成成功");
} static void InitAssembly()
{
AssemblyName assemblyName = new AssemblyName(namespaceName);
assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave);
moduleBuilder = assemblyBuilder.DefineDynamicModule(assemblyName.Name, binaryName);
} static void SaveAssembly()
{
Type t = typeBuilder.CreateType(); //完成Type,这是必须的
assemblyBuilder.Save(binaryName);
}
}
}
MSIL实用指南-字段的加载和保存的更多相关文章
- SharePoint 2013 新建项目字段自动加载上次保存值
1.点击进入NewForm.aspx页面,编辑页面,插入Script Editor WebPart,如下图: 2.插入后如下图,拖动AutoRecord WebPart到脚本编辑器上面,防止因为加载顺 ...
- MSIL实用指南-加载和保存参数
本篇讲解怎么加载和保存参数,以及参数起始序号的确定. 参数的加载加载参数的指令是Ldarg.Ldarg_S.Ldarg_0.Ldarg_1.Ldarg_2.Ldarg_3.Ldarg_0是加载第0个参 ...
- MSIL实用指南-生成索引器
MSIL实用指南-生成索引器 索引器是一种特殊的属性,它有参数的,也有get和set方法,属性名称一般是"Item",并且方法名称一般名称是"get_Item" ...
- MSIL实用指南-Action的生成和调用
MSIL实用指南-Action的生成和调用 System.Action用于封装一个没有参数没有返回值的方法.这里生成需要Ldftn指令. 下面讲解怎生成如下的程序. class ActionTest ...
- 简单实用的进度条加载组件loader.js
本文提供一个简单的方法实现一个流程的进度条加载效果,以便在页面中可以通过它来更好地反馈耗时任务的完成进度.要实现这个功能,首先要考虑怎样实现一个静态的进度条效果,类似下面这样的: 这个倒是比较简单,两 ...
- Knockout应用开发指南 第六章:加载或保存JSON数据
原文:Knockout应用开发指南 第六章:加载或保存JSON数据 加载或保存JSON数据 Knockout可以实现很复杂的客户端交互,但是几乎所有的web应用程序都要和服务器端交换数据(至少为了本地 ...
- MSIL实用指南-struct的生成和操作
struct(结构)是一种值类型,用于将一组相关的信息变量组织为一个单一的变量实体.所有的结构都继承自System.ValueType类,因此是一种值类型,也就是说,struct实例分配在线程的堆栈( ...
- MSIL实用指南-一维数组的操作
本篇讲解怎么生成和操作一维数组.各种数组类型创建的步骤是一样的,但是加载和保存步骤有所不同. 一.创建数组所有类型的一维数组创建都是一样的,分三步.1.加载数组长度2.生成指令 Newarr < ...
- 第六章:加载或保存JSON数据
加载或保存JSON数据 Knockout可以实现很复杂的客户端交互,但是几乎所有的web应用程序都要和服务器端交换数据(至少为了本地存储需要序列化数据),交换数据最方便的就是使用JSON格式 – 大多 ...
随机推荐
- 2017CCPC 网络选拔赛1003 Ramsey定理
Ramsey定理 任意6个人中,一定有三个人互为朋友,或者互相不是朋友. 证明 这里我就不证明了.下面链接有证明 鸽巢原理 Ramsey定理 AC代码 #include <stdio.h> ...
- HDU - 2614 dfs
思路:记录当前用的最大时间即刚解决的问题花费的时间,下一个应该做的题的时间必须大于等于刚才的. AC代码 #include <cstdio> #include <cmath> ...
- TCP/IP协议学习和理解
TCP:Transmission Control Protocol-传输控制协议 IP:Internet Protocol-网络协议 TCP/IP 不是一个协议,而是一个协议族的统称,里面包括了 IP ...
- 自动化测试 selenium中WebDriver 和WebElement的区别
之前在做UI自动化测试中 经常会用到 WebDriver 和 WebElement两个类 以前对这两个类总感觉有点傻傻分不清 昨天看了下之前下的代码 结合自己的理解 对着两个类的区别和关系 ...
- galera断电后无法重建集群
节点有一个测试环境,数据库用的三节点galera,测试组的同事把电源同时断了.节后回来开机,发现数据库状态一直有问题,以前遇到这种情况,都是把一个节点中的my.conf中的wsrep配置全删掉,作为一 ...
- webpack代码分离 ensure 看了还不懂,你打我(转)
webpack异步加载的原理 webpack ensure相信大家都听过.有人称它为异步加载,也有人说做代码切割,那这 个家伙到底是用来干嘛的?其实说白了,它就是把js模块给独立导出一个.js文件的, ...
- Python中从B类中调用A类的方法。
好久没上了,Python还在学--最近进度有点慢... 下面代码记录了一个不太好理解的点,自己写了个小例子,总算是理顺了. B类想要调用A类,自己在网上看了一下其他人的回复:创建A类的实例,直接调用这 ...
- 电脑开机后,就会自动运行chkdsk,我想取消chkdsk,怎么取消
每次开机都自动检查磁盘,检测通过后下次还是一样,NTFS/FAT32分区都有可能有这样的情况,即使重装系统,仍可能出现同样情况,但是硬盘可以通过Dell 随机带的检测程序解决方法:在命令行窗口中 ...
- Unhandled event loop exception Java heap space
1 错误描述 2 错误原因 3 解决办法
- java.lang.NumberFormatException
1.错误描述 Exception in thread "main" java.lang.NumberFormatException: For input string: " ...