本篇讲解怎么样生成接口,即interface。

一、创建类型
创建一个接口类型依旧用ModuleBuilder的DefineType方法,但是它的第二个参数必须要有
TypeAttributes.Interface | TypeAttributes.Abstract。这样才能是一个接口类型。

实例代码:

TypeBuilder typeBuilder = moduleBuilder.DefineType(namespaceName + "." + typeName,
TypeAttributes.Public
| TypeAttributes.Interface
| TypeAttributes.Abstract
);

二、给接口添加继承父接口
按照C#语言规范,一个接口可以继承多个接口。在这里我们要用TypeBuilder的AddInterfaceImplementation
方法,参数是一个Type。

实例代码:

typeBuilder.AddInterfaceImplementation(typeof(System.IDisposable));
typeBuilder.AddInterfaceImplementation(typeof(System.IConvertible));

三、实现成员
C#的接口内的成员必须是public的,而且只能声明,不能实现。所以接口方法必须是
MethodAttributes.Public | MethodAttributes.Abstract | MethodAttributes.Virtual ,
接口内属性的get和set方法必须也是如此。

完整的程序如下:

using System;
using System.Reflection;
using System.Reflection.Emit; namespace LX1_ILDemo
{
public class Demo22_InterfaceBuilder
{
public static void Generate()
{
/*
public interface IMyDynamicInteface
{
int Number{get;set;}
int MyMethod(int multiplier);
}
*/
string binaryName = "Demo22_InterfaceBuilder.dll";
string namespaceName = "LX1_ILDemo";
string typeName = "DemoInterface"; AssemblyName assemblyName = new AssemblyName(namespaceName);
AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave);
ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule(assemblyName.Name, binaryName); TypeBuilder typeBuilder = moduleBuilder.DefineType(namespaceName + "." + typeName,
TypeAttributes.Public
| TypeAttributes.Interface
| TypeAttributes.Abstract
); typeBuilder.AddInterfaceImplementation(typeof(System.IDisposable));
typeBuilder.AddInterfaceImplementation(typeof(System.IConvertible)); PropertyBuilder pbNumber = typeBuilder.DefineProperty(
"Number",
PropertyAttributes.HasDefault,
typeof(int),
null); MethodAttributes getSetAttr = MethodAttributes.Public | MethodAttributes.Abstract | MethodAttributes.Virtual |
MethodAttributes.SpecialName | MethodAttributes.HideBySig; MethodBuilder mbNumberGetAccessor = typeBuilder.DefineMethod(
"get_Number",
getSetAttr,
typeof(int),
Type.EmptyTypes); MethodBuilder mbNumberSetAccessor = typeBuilder.DefineMethod(
"set_Number",
getSetAttr,
null,
new Type[] { typeof(int) }); pbNumber.SetGetMethod(mbNumberGetAccessor);
pbNumber.SetSetMethod(mbNumberSetAccessor); MethodBuilder meth = typeBuilder.DefineMethod(
"MyMethod",
MethodAttributes.Public | MethodAttributes.Abstract | MethodAttributes.Virtual,
typeof(int),
new Type[] { typeof(int) }); Type t = typeBuilder.CreateType(); assemblyBuilder.Save(binaryName); Console.WriteLine("创建接口IMyDynamicInteface完毕");
Console.ReadKey();
}
}
}

MSIL实用指南-生成接口的更多相关文章

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

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

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

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

  3. MSIL实用指南-生成构造函数

    本篇讲解生成构造函数的一些知识,包括创建实例构造函数.静态构造函数.调用父类构造函数. 生成构造函数的方法生成构造函数的方法是TypeBuilder.DefineConstructor(MethodA ...

  4. MSIL实用指南-生成if...else...语句

    if...else...语句是非常重要的选择语句,它的生成一般需要ILGenerator的DefineLabel方法和MarkLabel方法,以及Brtrue_S和Br_S指令. 一.DefineLa ...

  5. MSIL实用指南-生成内部类

    生成内部类用TypeBuilder的DefineNestedType方法,得到另一个TypeBuilder.内部类的可访问性都是TypeAttributes的“Nested”开头一些成员.实例代码:y ...

  6. MSIL实用指南-生成foreach语句

    foreach可以迭代数组或者一个集合对象.foreach语句格式是它的生成步骤是foreach (<成员> in <集合>) <循环体> 一.声明三个变量,loc ...

  7. MSIL实用指南-生成for语句

    for语句格式是这样的for(<初始化语句>;<条件语句>;<自增减语句>) <循环体> 它可以转换为while语句 if(<条件语句>){ ...

  8. MSIL实用指南-生成异常处理

    本篇讲解怎么生成异常.C# 异常处理时建立在四个关键词之上的:try.catch.finally 和 throw. 一.异常的抛出抛出异常在C#语言中要使用throw关键字,使用方法是throw &l ...

  9. MSIL实用指南-生成while语句

    本篇讲解怎样生成while语句.while语句是编程语言中很重要的循环语句,它的结构是while(<表达式>) <语句或语句块> 当表达式的结果为true时就一直执行语句或语句 ...

随机推荐

  1. c#多线程同步之lock

    一提起lock,想必大家都很熟悉,因为它易用,顾名思义,就是一把锁,常用于多线程的同步,一次只允许一个线程进入.最近遇到一个很诡异的bug. private static readonly objec ...

  2. Web项目生成详解

    action 与用户控制层相关内容,来自用户的请求和页面跳转: dao 数据库进行增删改查操作,接口定义其中: dao.impl 将上述接口进行实现 domain 数据表都映射成java中的类,实现数 ...

  3. Python多线程爬虫与多种数据存储方式实现(Python爬虫实战2)

    1. 多进程爬虫 对于数据量较大的爬虫,对数据的处理要求较高时,可以采用python多进程或多线程的机制完成,多进程是指分配多个CPU处理程序,同一时刻只有一个CPU在工作,多线程是指进程内部有多个类 ...

  4. 数组的迭代方法(every、filter、forEach、map、some)

    every: 对数组中的,每一项运行给定函数,如果该函数对每一项都返回true,则返回true. var number = [1,2,3,4,5,6]; var result = number.eve ...

  5. MongoDB起步

    1.Mongodb基本概念和SQL的区别:SQL术语        MongoDB术语database    databasetable        collectionrow        doc ...

  6. 九度OJ题目1003:A+B

    while(cin>>str1>>str2)就行了,多简单,不得不吐槽,九度的OJ真奇葩 题目描述: 给定两个整数A和B,其表示形式是:从个位开始,每三位数用逗号", ...

  7. Java中动态代理工作流程

    当谈到动态代理就会想到接口,因为接口是一种规范,动态代理对象通过接口便会很清楚地知道他的实现类(被代理对象)是何种类型的(即有哪些方法).Now,然我们来开始编写一个例子来了解动态代理的全过程: 第一 ...

  8. Linux环境下安装weblogic10.3.2

    附件:weblogic10.3.2版本zip包和部署war包提取地址: weblogic.zip:https://pan.baidu.com/s/1Y1tmAhlXsO5Q4zPvOKGG5g  提取 ...

  9. 记kkpager分页控件的使用

    kkpager支持异步加载分页: 1.页面添加div标签和引用JS,默认标签为<div id="kkpager"></div> 引用JS和样式 <sc ...

  10. 使用angular-ui-router替代ng-router

    angular框架自身提供的ng-route在一定程度上满足了我们的需求,但是他只针对于单视图,比如点击一个link跳转到另一个视图,但是在实际业务中,需要一个状态对应的视图中还包含其他的视图,或者一 ...