zoukankan      html  css  js  c++  java
  • 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();
            }
        }
    }
    View Code
  • 相关阅读:
    PHP代码审计学习(7)——XSS漏洞
    PHP代码审计学习(6)——命令执行
    PHP代码审计学习(5)——代码执行漏洞
    PHP代码审计学习(4)——SQL漏洞
    PHP代码审计学习(3)——常见的超全局变量
    PHP代码审计学习(2)——php.ini核心配置
    关于Backus-Naur Form巴克斯诺尔范式和扩展巴克斯范式的知识点和相关词语中英文对照
    Python对列表的相关操作(与JAVA对比)
    MergeSort归并排序和利用归并排序计算出数组中的逆序对
    统计字符串中每种字符出现的评率(HashMap中getOrDefault(K, V)方法的使用)
  • 原文地址:https://www.cnblogs.com/tkt2016/p/8727785.html
Copyright © 2011-2022 走看看