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);
        }
    }
}

原文地址:https://www.cnblogs.com/tkt2016/p/8624256.html

时间: 2024-11-08 19:05:24

MSIL实用指南-字段的加载和保存的相关文章

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

1.点击进入NewForm.aspx页面,编辑页面,插入Script Editor WebPart,如下图: 2.插入后如下图,拖动AutoRecord WebPart到脚本编辑器上面,防止因为加载顺序的问题无法找到页面上的DOM: 3.在脚本编辑器中添加脚本的外部引用,和需要执行的方法,如下图: 4.去引用的外部脚本中,编写我们的脚本,如下图: 原理就是用脚本在现有的Save按钮前添加一个新的Save按钮,同时隐藏掉默认的,新按钮的功能就是将要保存的字段值写到Cookie里面,并执行旧按钮的保

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

本文提供一个简单的方法实现一个流程的进度条加载效果,以便在页面中可以通过它来更好地反馈耗时任务的完成进度.要实现这个功能,首先要考虑怎样实现一个静态的进度条效果,类似下面这样的: 这个倒是比较简单,两个div即可,bootstrap官方就提供有多种主题的进度条组件.如果自己要用,参照下别人的代码,写成自己的风格即可,实际上也非常的好理解: .progress { height: 20px; background-color: #f5f5f5; border-radius: 4px; box-sh

功能列表字段懒加载原理——JEPLUS快速开发平台

JEPLUS之功能列表字段懒加载原理 当我们在点击进入一个列表或者是列表是总会遇到这样的情况---加载缓慢.在我们配置列表或者表单中默认会员很多的加载项,我们并不是都需要每次点开时都要加载.在今天我给大家介绍下遇到这种情况怎么解决. 一.效果展示 二.准备工作 1.JEPLUS平台5.0.0.2 2.数据库MySql 5.7 三,实现步骤 1.我们在有些场景下需要配置很多列表字段,还有很多的表单字段,那么它在加载的过程中就会逐步加载很缓慢,我们这里给他设置懒加载的目的就是提高列表的展示速度来展示

ios的文件加载和保存

最近,一直在看比较基础的知识,因为感觉自己需要整理一下最基层的东西,然后才能系统的结合起来,很多时候我们做项目都需要对文件加载和保存,我自己对已有知识整理了一下: 1.使用属性列表保存对象: 在Cocoa中,与一类名为属性列表的对象,常简称为plist.这些列表包含Cocoa知道如何操作的一组对象.具体来讲,Cocoa知道如何将它们保存到文件中并进行加载.属性列表类包括:NSArray,NSDictionary,NSString和NSData,以及它们的变体(Mutable) NSAutorel

6.Knockout.Js(加载或保存JSON数据)

前言 Knockout可以实现很复杂的客户端交互,但是几乎所有的web应用程序都要和服务器端交换数据(至少为了本地存储需要序列化数据),交换数据最方便的就是使用JSON格式 – 大多数的Ajax应用程序也是使用这种格式. 加载或保存数据 Knockout不限制你用任何技术加载和保存数据.你可以使用任何技术和服务器来交互.用的最多的是使用jQuery的Ajax帮助,例如:getJSON,post和ajax.你可以通过这些方法从服务器端获取数据: $.getJSON("/some/url"

MSIL实用指南-加载null、string、long、float、double等值

本篇讲述怎么加载null.string值.long值.float值.double值. 加载null不需要参数值,只要 Emit ldnull 其它几个命令要 Emit <指令> <值> 加载null 加载null是很简单的,使用OpCodes.Ldnull,以下一句程序就可以了. ilGenerator.Emit(OpCodes.Ldnull); 加载string值 加载string值也很简单,使用OpCodes.Ldstr,格式是 ilGenerator.Emit(OpCodes

基于requirejs+bluebird,50行代码实现轻巧实用的前端CMD加载器

首先是github地址,可以用git克隆命令也可以直接在git页面下载 https://github.com/kazetotori/js-requireAsync 下载下来后目录结构是这样的 -package.json -index.js -node_modules --bluebird --jquery --requirejs requireAsync函数 requireAsync函数是index.js里定义的一个全局函数,该函数接受无限多个字符串参数,参数为需要加载的模块名或模块路径,路径不

Three.js开发指南---创建,加载高级网格和几何体(第八章)

本章的主要内容: 一, 通过Three.js自带的功能来组合和合并已有的几何体,创建出新的几何体 二, 从外部资源中加载网格和几何体 1 前面的章节中,我们学习到,一个几何体创建的网格,想使用多个材质的方法: var mesh=THREE.SceneUtils.createMultiMaterialObject(geometry,[material1,,material2]); 看似一个网格中有一个几何体,多个材质,其实该网格拥有与材质数量相对应的几何体,每个几何体都对应一种材质,形成一个网格,

day61-Spark SQL数据加载和保存内幕深度解密实战

Spark SQL加载数据 SparkSQl 数据输入输入输出主要是DataFrame,DataFrame提供了一些通用的load和save操作. 通过load可以创建出DataFrame:通过save可以将DataFrame数据保存到文件中或者说以具体的格式来指明要读取的文件是什么格式或者输出的数据是什么格式:直接读取 文件的指定类型: SQLContext源码: load 和save方法 @deprecated("Use read.load(path). This will be remov