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(); } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?