c# emit 动态实现接口
using System;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit; namespace TestEmit{ public interface IPerson{
void SayHello(); } class Person2 {
public void SayHello() { Console.WriteLine("i am person2");
}
} class Test2
{
static void Main(string[] args)
{
IPerson p = (IPerson)CreateType();
p.SayHello(); Console.ReadLine();
} public static object CreateType()
{
AssemblyName assemblyName = new AssemblyName("assemblyName");
AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave);
ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("PersonModule", "Person.dll");
TypeBuilder typeBuilder = moduleBuilder.DefineType("Person", TypeAttributes.Public);
//*添加所实现的接口
typeBuilder.AddInterfaceImplementation(typeof(IPerson)); //实现方法
MethodBuilder mbIM = typeBuilder.DefineMethod("SayHello",
MethodAttributes.Public | MethodAttributes.HideBySig |
MethodAttributes.NewSlot | MethodAttributes.Virtual |
MethodAttributes.Final,
null,
Type.EmptyTypes); ILGenerator il = mbIM.GetILGenerator();
il.Emit(OpCodes.Ldstr, "The SayHello implementation of IPerson");
il.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine",
new Type[] { typeof(string) }));
il.Emit(OpCodes.Ret);
typeBuilder.DefineMethodOverride(mbIM, typeof(IPerson).GetMethod("SayHello"));
//添加方法
//MethodBuilder sayHelloMethod = typeBuilder.DefineMethod("SayHello", MethodAttributes.Public, null, null); //ILGenerator ilOfSayHello = sayHelloMethod.GetILGenerator();
//ilOfSayHello.Emit(OpCodes.Ldstr, "蝈蝈");
//ilOfSayHello.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }));
//ilOfSayHello.Emit(OpCodes.Call, typeof(Console).GetMethod("ReadLine"));
////没有返回值所有加OpCodes.Pop
//ilOfSayHello.Emit(OpCodes.Pop);
//ilOfSayHello.Emit(OpCodes.Ret);
Type personType = typeBuilder.CreateType();
assemblyBuilder.Save("Person.dll");
object obj = Activator.CreateInstance(personType);
MethodInfo methodInfo = personType.GetMethod("SayHello"); methodInfo.Invoke(obj, null);
return Activator.CreateInstance(personType);
} } }
c# emit 动态实现接口的更多相关文章
- C# Emit动态代理生成一个实体对象
/// <summary> /// 使用Emit动态代理收集实体信息 /// </summary> /// <typeparam name="T"&g ...
- 秒懂C#通过Emit动态生成代码 C#使用Emit构造拦截器动态代理类
秒懂C#通过Emit动态生成代码 首先需要声明一个程序集名称, 1 // specify a new assembly name 2 var assemblyName = new Assembly ...
- Java EE开发平台随手记5——Mybatis动态代理接口方式的原生用法
为了说明后续的Mybatis扩展,插播一篇广告,先来简要说明一下Mybatis的一种原生用法,不过先声明:下面说的只是Mybatis的其中一种用法,如需要更深入了解Mybatis,请参考官方文档,或者 ...
- Emit动态生成代码
Emit动态生成代码 引用:秒懂C#通过Emit动态生成代码 首先需要声明一个程序集名称, // specify a new assembly name var assemblyName = new ...
- React和动态网站接口的经济学
来自: React and the economics of dynamic web interfaces 自从2000开始我就一直在做web开发,曾见过很多以各种库和框架的起起落落,这些库和框架作为 ...
- Emit动态代理.NetCore迁移之旅
[前言] 前面我们介绍了Aop 从静态代理到动态代理:https://www.cnblogs.com/7tiny/p/9657451.html 我们在.NetFramework平台下使用微软提供的Em ...
- Emit动态生成代理类用于监控对象的字段修改
利用Emit动态生成代理对象监控对象哪些字段被修改,被修改为什么值 被Register的对象要监控的值必须是Virtual虚类型 必须使用CreateInstance创建对象 必须使用DynamicP ...
- .Net Core JWT 动态设置接口与权限
通过上一篇.Net Core官方的 JWT 授权验证学习到了JWT的授权.可以发现一个问题,就是如果每个接口可以使用的角色都是写死的,这样如果有所修改会非常麻烦,虽然用policy可以一定程度上缓解, ...
- C#动态创建接口的实现实例对象
本文简单介绍如何动态创建接口interface的实现实例对象,包含两个知识点: 1.如何获取接口interface的所有实现实例对象? 2.如何判断实例对象的构造函数是否有参数? 准备工作 首先新建一 ...
随机推荐
- NOI2001食物链
描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A吃B,B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种. 有人 ...
- ThreadPool基础之RegisterWaitForSingleObject
原文发布时间为:2010-10-27 -- 来源于本人的百度文章 [由搬家工具导入] 首先我们看一下它的原型: Codepublic static RegisteredWaitHandle Regis ...
- pyspider 爬虫教程(一):HTML 和 CSS 选择器
虽然以前写过 如何抓取WEB页面 和 如何从 WEB 页面中提取信息.但是感觉还是需要一篇 step by step 的教程,不然没有一个总体的认识.不过,没想到这个教程居然会变成一篇译文,在这个 ...
- MySQL数据库”mysql SQL Error:1146,SQLState:42S02 “解决方法
项目在开发的时候在Mac平台下开发的,开发完了之后在LINUX环境上部署好之后,运行时MySQL数据库报错,提示为某个表不存在之类的错误信息,后来修改了MySQL的配置文件将大小写敏感去掉,问题解决. ...
- 树莓派个人实测 Q&A(最新修改使用Manjaro连接远程桌面) (二)
以下内容使用和http://www.eeboard.com/bbs/thread-5191-1-1.html所在的帖子一样的风格,不过原作者是window下的操作,本人的都是在manjaro linu ...
- Selenium2+python自动化(学习笔记3)
1.加载firefox配置 参考代码: # coding=utf-8from selenium import webdriver# 配置文件地址,打开Firefox点右上角设置--帮助--故障排除信息 ...
- C#数组排序以及比较对象的大小
先来看个小例子吧 ,,,,,}; Array.Sort(intArray); Array.ForEach<int>(intArray,(i)=>Console.WriteLine(i ...
- 关于main函数的参数
#include <stdio.h> int main(int argc, char const *argv[]) { int i; for ( i = 0; i < argc; i ...
- react-transition-group v2 用法概述
官方文档地址:https://reactcommunity.org/react-transition-group/ 在react-transition-group v2中,暴露了三个组件: Trans ...
- 当前标识(IIS APPPOOL\ASP.NET v4.0)没有对“C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files”的写访问权限 解决方案
今天搭环境的时候遇到这个问题,折腾了一阵子,最后在微软官方论坛上找到了解决方案. https://forums.asp.net/t/1566987.aspx?Current+Identity+does ...