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格式 – 大多 ...
随机推荐
- Django2.0文档
第四章 模板 1.标签 (1)if/else {% if %} 标签检查(evaluate)一个变量,如果这个变量为真(即,变量存在,非空,不是布尔值假),系统会显示在 {% if %} 和 {% e ...
- NLP︱高级词向量表达(一)——GloVe(理论、相关测评结果、R&python实现、相关应用)
有很多改进版的word2vec,但是目前还是word2vec最流行,但是Glove也有很多在提及,笔者在自己实验的时候,发现Glove也还是有很多优点以及可以深入研究对比的地方的,所以对其进行了一定的 ...
- python︱字符操作杂记(split、zip...)
字符串特别是中文在python里面还是有很多需要注意的地方. . . . 一.字符串 . . 1.字符串连接 方式一:单个字符相连用 + 就可以: 方式二:list组内相连,可以用join: 方式三: ...
- dm642的中断定时器
TIMER_Handle TimerHandle0; void timer1() { ////////////定时器/////////////////////// TimerHandle0 = TI ...
- 不使用spring的情况下用java原生代码操作mongodb数据库的两种方式
由于更改了mongodb3.0数据库的密码,导致这几天storm组对数据进行处理的时候,一直在报mongodb数据库连接不上的异常. 主要原因实际上是和mongodb本身无关的,因为他们改的是配置 ...
- jquery-1.11.1.js
每次想要使用这个js时,总是要到官网上下载,太麻烦,现在把它收录了 jquery-1.11.1.js /*! * jQuery JavaScript Library v1.11.1 * http ...
- Caused by: java.lang.ClassNotFoundException: org.springframework.orm.hibernate4.HibernateTemplate
1.错误描述 严重: Context initialization failed org.springframework.beans.factory.CannotLoadBeanClassExcept ...
- Windows DLL资料整理
1.使用Visual C++ 6.0创建dll 2. 函数的调用规则(__cdecl,__stdcall,__fastcall,__pascal) 要点: 1. 如果你的程序中没有涉及可变参数,最好使 ...
- 基于Spring Boot的RESTful API实践(一)
1. RESTful简述 REST是一种设计风格,是一组约束条件及原则,而遵循REST风格的架构就称为RESTful架构,资源是RESTful的核心,一个好的RESTful架构,通过URL就能很 ...
- 在TextBox中敲击回车执行ASP.NET后台事件
1.在TextBox中敲击回车执行ASP.NET后台事件 0.说明 页面中有一个用于搜索的TextBox,希望能在输入内容后直接回车开始搜索,而不是手动去点击它旁边的搜索按钮 但因为该TextBo ...