字段有静态字段和非静态字段之分,它们的加载保存指令也是不一样的,并且非静态字段要生成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实用指南-字段的加载和保存的更多相关文章

  1. SharePoint 2013 新建项目字段自动加载上次保存值

    1.点击进入NewForm.aspx页面,编辑页面,插入Script Editor WebPart,如下图: 2.插入后如下图,拖动AutoRecord WebPart到脚本编辑器上面,防止因为加载顺 ...

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

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

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

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

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

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

  5. 简单实用的进度条加载组件loader.js

    本文提供一个简单的方法实现一个流程的进度条加载效果,以便在页面中可以通过它来更好地反馈耗时任务的完成进度.要实现这个功能,首先要考虑怎样实现一个静态的进度条效果,类似下面这样的: 这个倒是比较简单,两 ...

  6. Knockout应用开发指南 第六章:加载或保存JSON数据

    原文:Knockout应用开发指南 第六章:加载或保存JSON数据 加载或保存JSON数据 Knockout可以实现很复杂的客户端交互,但是几乎所有的web应用程序都要和服务器端交换数据(至少为了本地 ...

  7. MSIL实用指南-struct的生成和操作

    struct(结构)是一种值类型,用于将一组相关的信息变量组织为一个单一的变量实体.所有的结构都继承自System.ValueType类,因此是一种值类型,也就是说,struct实例分配在线程的堆栈( ...

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

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

  9. 第六章:加载或保存JSON数据

    加载或保存JSON数据 Knockout可以实现很复杂的客户端交互,但是几乎所有的web应用程序都要和服务器端交换数据(至少为了本地存储需要序列化数据),交换数据最方便的就是使用JSON格式 – 大多 ...

随机推荐

  1. WeakHashMap回收时机结合JVM 虚拟机GC的一些理解

    一直很想知道WeakHashMap的使用场景,想来想去只能用在高速缓存中,而且缓存的数据还不是特别重要,因为key(key不存在被引用的时候)随时会被回收 所以研究了一下WeakHashMap的回收时 ...

  2. Hadoop压缩

    为什幺要压缩? 压缩会提高计算速度?这是因为mapreduce计算会将数据文件分散拷贝到所有datanode上,压缩可以减少数据浪费在带宽上的时间,当这些时间大于压缩/解压缩本身的时间时,计算速度就会 ...

  3. 快速排序(QuickSort)

    1.算法思想    快速排序是一种划分交换排序.它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod). (1) 分治法的基本思想    分治法的基本思想是:将原 ...

  4. FusionCharts 2D帕累托图

    1.了解帕累托图的特性以及和其他图的共性 2.设计帕累托图页面中引入图的类型以及怎么引入到页面 Pareto2D.html: <!DOCTYPE HTML PUBLIC "-//W3C ...

  5. Java和Flex整合报错(五)

    1.错误描述 usage: java org.apache.catalina.startup.Catalina [ -config {pathname} ] [ -nonaming ] { -help ...

  6. 芝麻HTTP: Python爬虫利器之PyQuery的用法

    前言 你是否觉得 XPath 的用法多少有点晦涩难记呢? 你是否觉得 BeautifulSoup 的语法多少有些悭吝难懂呢? 你是否甚至还在苦苦研究正则表达式却因为少些了一个点而抓狂呢? 你是否已经有 ...

  7. Good Bye 2017 E. New Year and Entity Enumeration

    先按照绿点进行分块 第一个绿点和最后一个绿点之后很好处理不说了 两个绿点之间的讨论: 有两种方案 1:红(蓝)点和绿点顺序连接,距离为相邻绿点距离(也就是双倍绿点距离) 2:红(蓝)点和绿点的点阵中寻 ...

  8. hdu5556 Land of Farms

    我对于题目的一种理解 改造农场 1.建新农场 在空的点选 2.重建旧农场 选一个点属于这个农场的地方都要选 最后的农场都不能相连 所以枚举旧农场的个数并进行二分图匹配 #include<bits ...

  9. Text Document Analysis CodeForces - 723B

    Modern text editors usually show some information regarding the document being edited. For example, ...

  10. MFC与Webbrower交互(通过JS)

    最近修改老旧的MFC项目,用的网页做界面,和HTML交互采用的是COM方式,繁琐,丑陋又性能低,于是考虑利用js来进行界面交互,查了一天的资料,现在整理如下,供后来需要的人参考,虽然大概几乎不会有人用 ...