MSIL实用指南-生成接口
本篇讲解怎么样生成接口,即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实用指南-生成接口的更多相关文章
- MSIL实用指南-生成索引器
MSIL实用指南-生成索引器 索引器是一种特殊的属性,它有参数的,也有get和set方法,属性名称一般是"Item",并且方法名称一般名称是"get_Item" ...
- MSIL实用指南-生成属性
本篇讲解怎么生成属性,包括get和set方法. 第一步,生成一个字段生成字段用TypeBuilder.DefineField方法.实例代码: FieldBuilder customerNameBldr ...
- MSIL实用指南-生成构造函数
本篇讲解生成构造函数的一些知识,包括创建实例构造函数.静态构造函数.调用父类构造函数. 生成构造函数的方法生成构造函数的方法是TypeBuilder.DefineConstructor(MethodA ...
- MSIL实用指南-生成if...else...语句
if...else...语句是非常重要的选择语句,它的生成一般需要ILGenerator的DefineLabel方法和MarkLabel方法,以及Brtrue_S和Br_S指令. 一.DefineLa ...
- MSIL实用指南-生成内部类
生成内部类用TypeBuilder的DefineNestedType方法,得到另一个TypeBuilder.内部类的可访问性都是TypeAttributes的“Nested”开头一些成员.实例代码:y ...
- MSIL实用指南-生成foreach语句
foreach可以迭代数组或者一个集合对象.foreach语句格式是它的生成步骤是foreach (<成员> in <集合>) <循环体> 一.声明三个变量,loc ...
- MSIL实用指南-生成for语句
for语句格式是这样的for(<初始化语句>;<条件语句>;<自增减语句>) <循环体> 它可以转换为while语句 if(<条件语句>){ ...
- MSIL实用指南-生成异常处理
本篇讲解怎么生成异常.C# 异常处理时建立在四个关键词之上的:try.catch.finally 和 throw. 一.异常的抛出抛出异常在C#语言中要使用throw关键字,使用方法是throw &l ...
- MSIL实用指南-生成while语句
本篇讲解怎样生成while语句.while语句是编程语言中很重要的循环语句,它的结构是while(<表达式>) <语句或语句块> 当表达式的结果为true时就一直执行语句或语句 ...
随机推荐
- LVS-NAT模式的配置详解
由于实验室拟态存储的项目需要通过NAT模式来映射NFS服务器已实现负载均衡的目的,通过调研了多种负载均衡机制,笔者最终选择了LVS的NAT模式来实现需求,接下来通过博客来记录一下LVS-NAT模式的配 ...
- spring中aop的注解实现方式简单实例
上篇中我们讲到spring的xml实现,这里我们讲讲使用注解如何实现aop呢.前面已经讲过aop的简单理解了,这里就不在赘述了. 注解方式实现aop我们主要分为如下几个步骤(自己整理的,有更好的方法的 ...
- R实战 第五篇:绘图(ggplot2)
ggplot2包实现了基于语法的.连贯一致的创建图形的系统,由于ggplot2是基于语法创建图形的,这意味着,它由多个小组件构成,通过底层组件可以构造前所未有的图形.ggplot2可以把绘图拆分成多个 ...
- iOS 神秘而又强大的传感器系统 (附demo)
iOS中的各种传感器: 随着科技的发展,机器感知人的行为!Goole的无人驾驶汽车到李彦宏的无人驾汽车,都带入了各种计算及传感. 为了研究自然现象和制造劳动工具,人类必须了解外界的各类信息.了解外界信 ...
- JS报表打印分页CSS
在调用window.print()时,可以实现打印效果,但内容太多时要进行分页打印. 在样式中有规定几个打印的样式 page-break-before和page-break-after CSS属性并不 ...
- 关于各种文件用Editplus的方式打开出现“向程序发送命令时出现问题”的解决方法
其实网上有很多解决方法,但是我试过都没有用. 我出现这个错误的原因是因为我的Editplus是以管理员的方式运行的,所以解决的办法有两种: 一.修改Editplus的兼容性,方法如下: 首先在Edit ...
- 自定义MVC框架---第一章
MVC基本介绍 介绍: mvc是一种编程思想,用来解决开发项目的时候,代码如何编写,项目如何架构的问题,更具体一点就是解决多人协同开发时,如何分工协作的问题,从而提升开发效率 举一个例子:有一个人想 ...
- nodejs-url网址解析的好帮手
HTTP协议中url和uri的区别. 每个url都是uri,但是不是每个uri都是url. URI:是统一资源的标识符,web上可用的每种资源如HTML文档.图像.视频片段.程序等都是一个URI来定位 ...
- python解决图的最短路径问题
在hihoCoder上遇到一个算法题目,描述如下: 对图结构有了解的不难发现,这是经典的求图的最短路径问题.以下是python代码: def findMin(row): minL = max(row) ...
- 笔记:I/O流-内存映射文件
内存映射文件时利用虚拟内存实现来将一个文件或者文件的一部分映射到内存中,然后整个文件就可以当作数组一样的访问,这个比传统的文件操作要快得多,Java 使用内存映射文件首先需要从文件中获取一个chann ...