MSIL实用指南-生成接口

时间:2023-03-08 21:37:47

本篇讲解怎么样生成接口,即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();
}
}
}