【前言】

  前面我们介绍了Aop 从静态代理到动态代理:https://www.cnblogs.com/7tiny/p/9657451.html

  我们在.NetFramework平台下使用微软提供的Emit技术实现了动态代理类的生成。但是.NetCore作为微软.Net平台的春天,如果类库光支持.NetFramework,那么未免有种没有跟上时代步伐的感觉,那么,我们就赶紧在.NetCore平台也实现一套吧。

  本想着新建一个.NetStandard项目,代码复制过来就直接能用的,没想到:一路坎坷...

【开始迁移】

  为了达到类库跨平台的目的,我们新建一个.NetStandard类库,选择什么版本呢?

  

  为了兼容目前很多老旧的项目,我们看到 .NetStandard1.2最低支持.Net Framwork 4.5。为了保持兼容性,先建一个.Net Standard 1.2版本的类库。

  代码复制过来,坑如下:

  

  1.Attribute的获取方法不支持

  

  2.Reflection 反射 GetMethods方法不支持,BindingFlags不支持(版本太低,Api没有全部实现)

  

  

  万般无奈之下,舍弃了兼容性,保证了代码的迁移。最终将我们的.Net Standard 项目升级到了Api比较完善的2.0版本。

  3..Net Standard/Core平台将以往的系统类库做了精简,曾经在System命名空间下的很多代码已经迁移到了单独的Nuget包中。

  

  如果我们要使用Emit这个特性的话,我们需要引用Nuget  System.Reflection.Emit,所有的Emit特性代码都包含在这个组件中。

  ...

  

  一整鼓捣之后,为什么还有代码在报红字...

  

  

  4.旧版不兼容(有的方法已被直接移除)

  这几个方法经过尝试,发现引用/更新程序集是解决不了的。上微软官方文档,居然发现这几个方法已经打上了过期标签。那么替代的方法呢?微软的官方文档里面并没有说明。最终通过一顿搜索,在stackoverflow了解到了.NetCore下的替代方法:

  

  

  以前的Domain(应用程序域)定义程序集的方法已经迁移到了AssemblyBuilderAccess(程序集访问)类中,虽然这个归类更加合理了,但是一言不合就不兼容是不有点让人吐槽啊...

  5.程序集不支持输出到目录

  

  .NetCore 平台已经不支持直接输出到目录,仅仅可以在内存中Run。

  6.typeBuilder类中的CreateType()方法消失

  

  CreateType()方法已经被直接移除掉了,官方解释是统一使用他的子类。这个答案最终通过搜索引擎在GitHub上找到了

  https://github.com/dotnet/coreclr/issues/2222

  上面的链接是GitHub中 dotnet/coreclr 微软官方项目中的Issue

  

  在其中可以看到我们遇到的很多坑在这里都有解释说明,而且表明了最新的使用方案:

  

  于是乎,就用Type的子类TypeInfo类了呗,CreateTypeInfo()

【终于不报错了】

  在解决完毕所有的迁移兼容问题后,我们还是上次文章中的所有单元测试流程。

  

  单元测试没有问题,我们本次的 .NetCore 平台代码迁移终于完成。

【总结】

  1. Emit动态代理.NetStandard2.0 最低支持意味着支持.Net Core2.0/.Net Framework 4.6.1以上;
  2. 微软在Api的迁移中,对部分代码进行了重新的归类,但是很多地方对旧版本不兼容我,切没有替换的官方文档;
  3. .Net Core 平台对系统类库进行了精简,移除了不必要的很多类库,需要使用的时候,通过对应的Nuget进行引用,但是没看到官方清单;

  最终结果是迁移完毕,新的项目命名为 SevenTiny.Bantina.Aop 吧,也算一个基础组件

  项目地址:https://github.com/sevenTiny/SevenTiny.Bantina

  如果想直接引用Nuget使用的,已经构建好了,Nuget包搜索 SevenTiny.Bantina.Aop 即可;

Emit动态代理.NetCore迁移之旅的更多相关文章

  1. C# Emit动态代理生成一个实体对象

    /// <summary> /// 使用Emit动态代理收集实体信息 /// </summary> /// <typeparam name="T"&g ...

  2. ILGenerator.Emit动态 MSIL编程(三)之动态代理

    using System; using System.Linq; using System.Reflection; using System.Reflection.Emit; public seale ...

  3. AOP从静态代理到动态代理 Emit实现

    [前言] AOP为Aspect Oriented Programming的缩写,意思是面向切面编程的技术. 何为切面? 一个和业务没有任何耦合相关的代码段,诸如:调用日志,发送邮件,甚至路由分发.一切 ...

  4. C#使用Emit构造拦截器动态代理类

    在AOP编程概念介绍中,常见的示例为拦截对象,并在对象的某方法执行前和执行后分别记录日志. 而最常用的拦截方式是使用动态代理类,用其封装一个日志拦截器,当方法被执行时进行日志记录. 日志拦截器类 1 ...

  5. .net动态代理-EMIT,AOP实现

    动态代理实现原理: 通过动态基础目标类,重写目标虚方法,.net中实现手段-il Emit.Proxy项目源码,https://github.com/1448376744/Emit.Proxy 以下是 ...

  6. 秒懂C#通过Emit动态生成代码 C#使用Emit构造拦截器动态代理类

    秒懂C#通过Emit动态生成代码   首先需要声明一个程序集名称, 1 // specify a new assembly name 2 var assemblyName = new Assembly ...

  7. netcore 之动态代理(微服务专题)

    动态代理配合rpc技术调用远程服务,不用关注细节的实现,让程序就像在本地调用以用. 因此动态代理在微服务系统中是不可或缺的一个技术.网上看到大部分案例都是通过反射自己实现,且相当复杂.编写和调试相当不 ...

  8. netcore 中的动态代理与RPC实现(微服务专题)

    一.关于RPC的调用 1. 调用者(客户端Client)以本地调用的方式发起调用: 2. Client stub(客户端存根)收到调用后,负责将被调用的方法名.参数等打包编码成特定格式的能进行网络传输 ...

  9. Emit动态生成代理类用于监控对象的字段修改

    利用Emit动态生成代理对象监控对象哪些字段被修改,被修改为什么值 被Register的对象要监控的值必须是Virtual虚类型 必须使用CreateInstance创建对象 必须使用DynamicP ...

随机推荐

  1. GAN模型生成手写字

    概述:在前期的文章中,我们用TensorFlow完成了对手写数字的识别,得到了94.09%的识别准确度,效果还算不错.在这篇文章中,笔者将带领大家用GAN模型,生成我们想要的手写数字. GAN简介 对 ...

  2. 开源项目福利-github开源项目免费使用Azure PipeLine

    微软收购Github后,很多人猜想微软可能会砍掉VSTS,然而事实VSTS并没有砍掉,关于Azure Devops的详细信息可以查看 这篇博客,如果想查看原文也可以从链接里提供的原始地址里查看. 今天 ...

  3. Zabbix3.0基础教程之二:item、trigger、action、graph配置

    一.Zabbix监控报警过程 在一次完整的Zabbix配置中,需要涉及到的术语有以下几项: 1.host groups:主机组,按生产需求将功能类别相近或相同的主机进行分组,便于管理. 2.host: ...

  4. SpringBoot系列——i18n国际化

    前言 国际化是项目中不可或缺的功能,本文将实现springboot + thymeleaf的HTML页面.js代码.java代码国际化过程记录下来. 代码编写 工程结构 每个文件里面的值(按工程结构循 ...

  5. Flask的请求处理机制

    在Flask的官方文档中是这样介绍Flask的: 对于Web应用,与客户端发送给服务器的数据交互至关重要.在Flask中由全局的request对象来提供这些信息 属性介绍 request.method ...

  6. vue 新版本 webpack 代理 跨域设置

    旧版本中:dev-server.js 这段去掉 var apiRoutes = express.Router() //getList apiRoutes.get('/getDiscList', fun ...

  7. 日志管理工具之logrotate

    Logrotate配置和测试 logrotate软件是一个日志管理工具,用于非分隔日志,删除旧的日志文件,并创建新的日志文件,起到“转储作用”,可以为系统节省磁盘空间.logrotate是基于cron ...

  8. windows蓝屏代码

    原始链接 引用自  https://docs.microsoft.com/zh-cn/windows-hardware/drivers/debugger/bug-check-code-referenc ...

  9. OpenUDID 和 IDFA 比较

    iOS标识符 现今来比较下,不同情况下两种标识符的变化情况.以下试验,每种标识符均分为存于Keychain和未存于Keychain的两种情况做比较. 广告标识符(IDFA-identifierForI ...

  10. Mina的IoBuffer改造成Netty的ByteBuff

    背景:部标GPS通讯底层全部改造成基于Netty服务器实现的,现将Mina的依赖移除,修改过程中有用到缓冲区的读写.现做了如下修改: 原有基于Mina的IoBuffer对字节读写封装代码如下: pac ...