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

创建字段的方法是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. Android浏览器访问java web的方法

    以前自己也做过Android程序,可以和服务器通信,通过json来存取数据,当时是在APP中直接存取数据的,而这次我打算在手机浏览器中获得服务器传过来的Json参数,后来才发现其实很简单的,首先需要手 ...

  2. WPF 照片墙的实现

    主要参照了DevExpress的PhotoGallery实例的实现. 效果如下: 照片墙核心代码如下: PhotoGallery.xaml <local:CarouselDemoModule x ...

  3. Java Enum总结

    枚举类型 枚举类型是Java5新增的特性之一,枚举是一种特殊类型的类,其枚举的每一个值 都是该枚举类的一个实例.枚举类型是作为Java语言的一部分,是完全类型安全的, 编译器会帮助我们检查枚举类型的正 ...

  4. 两种实现方式mycat多租户,枚举分片,注解拦截

    第一种: 优点:支持进一步分片 缺点:schema配置繁琐 注解式  /*!mycat:schema=[schemaName] */   注意:这在navicat 里面是会报错的,请用命令行登陆myc ...

  5. php留言板

    这个小项目的学习,就这样结束啦.由于过程中需要使用到js,这个目前还是感觉不会.之前的分析还是不太懂的.现在心里还是有点迷茫.什么都是照着葫芦画瓢. 我的拥有自己的东西才行.

  6. 【视频编解码·学习笔记】8. 熵编码算法:基本算法列举 & 指数哥伦布编码

    一.H.264中的熵编码基本方法: 熵编码具有消除数据之间统计冗余的功能,在编码端作为最后一道工序,将语法元素写入输出码流 熵解码作为解码过程的第一步,将码流解析出语法元素供后续步骤重建图像使用 在H ...

  7. GetWindowRect、GetClientRect、ScreenToClient与ClientToScreen

    GetWindowRect是取得窗口在屏幕坐标系下的RECT坐标(包括客户区和非客户区),这样可以得到窗口的大小和相对屏幕左上角(0,0)的位置. GetClientRect取得窗口客户区(不包括非客 ...

  8. 【mongodb系统学习之十】mongodb查询(三)

    6).特殊类型的查询: A).查询键为null的文档:查询时,如果按常规的key:null的方式做条 件,不仅会匹配到值为null的,还会匹配到不存在这个键的:如果只是要值为null的文档,就必须使用 ...

  9. stm32 fsmc 功能讲解(转)

    LCD有如下控制线:CS:Chip Select 片选,低电平有效RS:Register Select 寄存器选择WR:Write 写信号,低电平有效RD:Read 读信号,低电平有效RESET:重启 ...

  10. Day25 前端自学日记——入坑记

    一 学习契机 今年是走出校门的第一个年头,进入了一家还算不错的公司,领着一份还算不错的薪水,在外人眼中,似乎这样已经不错了,只要我努力好好做,前程一片光明.可事实真是这样吗?两份实习经历都指向我应该从 ...