本篇讲解怎么创建字段,主要是在修饰符的创建上。

创建字段的方法是TypeBuilder.DefineField,传入字段名称、字段类型、字段修饰符等参数,返回一个FieldBuilder对象。
先看这一句程序

FieldBuilder nameFieldBuilder = typeBuilder.DefineField("Name", typeof(string), FieldAttributes.Private);

上面一条程序是创建一个叫"Name"的数据类型为"string"的字段,等同于

private string Name;

FieldAttributes是枚举类型,决定字段的修饰符。详细说明如下

C#语言规范只是用到了FieldAttributes的一部分枚举,并没有用到全部。

FieldBuilder ageFieldBuilder = typeBuilder.DefineField("Arg", typeof(int), FieldAttributes.Public);

等同于C#语言
public int Arg;

FieldBuilder maxCountFieldBuilder = typeBuilder.DefineField("MaxCount", typeof(long), FieldAttributes.Family);

等同于C#语言
protected long MaxCount;

FieldBuilder IFFieldBuilder = typeBuilder.DefineField("IF", typeof(string), FieldAttributes.Assembly);

等同于C#语言
internal string IF;

FieldBuilder PIFFieldBuilder = typeBuilder.DefineField("PIF", typeof(string),
FieldAttributes.Family | FieldAttributes.FamORAssem);

等同于C#语言
protected internal string PIF;

FieldBuilder PRFieldBuilder = typeBuilder.DefineField("RF", typeof(string),
FieldAttributes.Private | FieldAttributes.InitOnly);

等同于C#语言
private readonly string RF;

FieldBuilder CFFieldBuilder = typeBuilder.DefineField("CF", typeof(string),
FieldAttributes.Private | FieldAttributes.Literal);

等同于C#语言
private const string CF;

FieldBuilder SFFieldBuilder = typeBuilder.DefineField("SF", typeof(string),
FieldAttributes.Private | FieldAttributes.Static);

等同于C#语言
private static string SF;

完成的程序如下:

using System;
using System.Reflection;
using System.Reflection.Emit; namespace LX1_ILDemo
{
class Demo05_FieldCreate
{
static string binaryName = "Demo05_FieldCreate.dll";
static string namespaceName = "LX1_ILDemo";
static string typeName = "EmitFieldCreate"; static AssemblyBuilder assemblyBuilder;
static ModuleBuilder moduleBuilder;
static TypeBuilder typeBuilder; static void Create_Fileds()
{
/* private string Name; */
FieldBuilder nameFieldBuilder = typeBuilder.DefineField("Name", typeof(string), FieldAttributes.Private);
/* public int Arg; */
FieldBuilder ageFieldBuilder = typeBuilder.DefineField("Arg", typeof(int), FieldAttributes.Public);
/* protected long MaxCount; */
FieldBuilder maxCountFieldBuilder = typeBuilder.DefineField("MaxCount", typeof(long), FieldAttributes.Family); /* internal string IF; */
FieldBuilder IFFieldBuilder = typeBuilder.DefineField("IF", typeof(string), FieldAttributes.Assembly); /* protected internal string PIF; */
FieldBuilder PIFFieldBuilder = typeBuilder.DefineField("PIF", typeof(string),
FieldAttributes.Family | FieldAttributes.FamORAssem); /* private readonly string RF; */
FieldBuilder PRFieldBuilder = typeBuilder.DefineField("RF", typeof(string),
FieldAttributes.Private | FieldAttributes.InitOnly); /* private const string CF; */
FieldBuilder CFFieldBuilder = typeBuilder.DefineField("CF", typeof(string),
FieldAttributes.Private | FieldAttributes.Literal); /* private static string SF; */
FieldBuilder SFFieldBuilder = typeBuilder.DefineField("SF", typeof(string),
FieldAttributes.Private | FieldAttributes.Static);
} public static void Generate()
{
InitAssembly(); typeBuilder = moduleBuilder.DefineType(namespaceName + "." + typeName, TypeAttributes.Public);
Create_Fileds(); 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. MSIL实用指南-给字段、属性、方法、类、程序集加Attribute

    C#编程中可以给字段.方法.类以及程序集加特性即继承于Attribute的类.这里讲解怎么在IL中给它们加上特性. 生成字段的对应的类是FieldBuilder,生成属性的对应的类是PropertyB ...

  2. MSIL实用指南-创建枚举类型

    创建枚举类型比较简单,主要使用moduleBuilder.DefineEnum 和enumBuilder.DefineLiteral. 第一步:创建 EnumBuilder 创建 EnumBuilde ...

  3. MSIL实用指南-创建方法和定义参数

    本篇讲解实现创建方法.指定参数的名称.实现参数加out和ref修饰符.以及参数加默认值. 创建方法 创建方法用类TypeAttributes的 DefineMethod(string name, Me ...

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

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

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

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

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

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

  7. MSIL实用指南-字段的加载和保存

    字段有静态字段和非静态字段之分,它们的加载保存指令也是不一样的,并且非静态字段要生成this. 静态字段的加载加载静态字段的指令是Ldsfld.ilGenerator.Emit(OpCodes.Lds ...

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

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

  9. MSIL实用指南-局部变量的声明、保存和加载

    这一篇讲解方法内的局部变量是怎么声明.怎样保存.怎样加载的. 声明局部变量声明用ILGenerator的DeclareLocal方法,参数是局部变量的数据类型,得到一个局部变量对应的创建类LocalB ...

随机推荐

  1. 高并发关于微博、秒杀抢单等应用场景在PHP环境下结合Redis队列延迟入库

    第一步:创建模拟数据表. CREATE TABLE `test_table` ( `id` int(11) NOT NULL AUTO_INCREMENT, `uid` int(11) NOT NUL ...

  2. struts2框架概述

    框架概述 什么是框架,为什么使用框架,框架优点 框架(framework)是一个基本概念上的结构,用于去解决或者处理复杂的问题 框架,即framework.其实就是某种应用的半成品,就是一组组件,供你 ...

  3. CAN总线知识总结

    CAN总线知识整理 一.特点 二.CAN物理层 隐性(逻辑1),显性(逻辑0). 三.CAN数据链路层 3.1通信机制 3.2数据帧 3.3错误帧 3.4其它帧格式 3.5位定时与同步

  4. C语言结构体定义的几种方法

    什么是结构体? 在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类.结构体可以被声明为变量.指针或数组等,用以实现较复杂的数据 ...

  5. Jmeter MD5插件

    实际业务中,会要求 HTTP 协议中附加 MD5 校验字段, 防止请求参数被恶意篡改, 对于开发同学来说, 这是个很简单的需求. 但是给自动化测试增加了难度, Jmeter 原生不支持这个功能,应测试 ...

  6. ubuntu自动登录tty1(shell,text)配置

    1.写脚本autologin 代码: #!/bin/bash/bin/login -f #你的用户名 移动到/usr/bin/下,并且用chmod +x autologin设置可执行权限 2.修改/e ...

  7. 用GA算法设计22个地点之间最短旅程-R语言实现

    数据挖掘入门与实战  公众号: datadw 相关帖子 转载︱案例 基于贪心算法的特征选择 用GA算法设计22个地点之间最短旅程-R语言实现 ----------------------------- ...

  8. Android常见Crash类型分析(一)

    问题1.   java.lang.IllegalStateException: The specified child already has a parent. You must call remo ...

  9. freemarker报错之十三

    1.错误描述 freemarker.core.ParseException: Token manager error: freemarker.core.TokenMgrError: Unknown d ...

  10. Caused by: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'content' a

    1.错误描述 org.hibernate.exception.DataException: could not execute statement at org.hibernate.exception ...