Emit动态代理.NetCore迁移之旅

【前言】

  前面我们介绍了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 即可;

原文地址:https://www.cnblogs.com/7tiny/p/9710406.html

时间: 2024-08-25 18:36:47

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

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

using System; using System.Linq; using System.Reflection; using System.Reflection.Emit; public sealed class DynamicProxy { private static readonly string AssemblyName = "DynamicProxy", ModuleName = "DynamicProxy", TypeName = "Dyna

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

在AOP编程概念介绍中,常见的示例为拦截对象,并在对象的某方法执行前和执行后分别记录日志. 而最常用的拦截方式是使用动态代理类,用其封装一个日志拦截器,当方法被执行时进行日志记录. 日志拦截器类 1 public class Interceptor 2 { 3 public object Invoke(object @object, string @method, object[] parameters) 4 { 5 Console.WriteLine( 6 string.Format("Int

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

动态代理实现原理: 通过动态基础目标类,重写目标虚方法,.net中实现手段-il Emit.Proxy项目源码,https://github.com/1448376744/Emit.Proxy 以下是基于Emit.Proxy实现的Demo class Program { static void Main(string[] args) { Console.WriteLine("Hello World!"); var generator = new ProxyGenerator(); //

重温Spring之旅5——AOP代理对象、JDK动态代理、使用cglib生产代理

AOP--代理对象 代理模式:代理模式的英文叫做Proxy或Surrogate,中文都可译为"代理",所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 抽象主题角色:声明了真实主题和代理主题的共同接口,这样一来在任何可以使用真实主题的地方都可以是使用代理主题. 代理主题(Proxy)角色:代理主题角色内部含有对真实主题的引用,从而可以在任何时候操作真实主题对象:

Java 动态代理机制分析及扩展,第 1 部分

引言 Java 动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类.代理类会负责将所有的方法调用分派到委托对象上反射执行,在分派执行的过程中,开发人员还可以按需调整委托类对象及其功能,这是一套非常灵活有弹性的代理框架.通过阅读本文,读者将会对 Java 动态代理机制有更加深入的理解.本文首先从 Java 动态代理的运行机制和特点出发,对其代码进行了分析,推演了动态生成类的内部实现. 回页首 代理:设计模式 代理是一种常用的设计

Java设计模式—Proxy动态代理模式

代理:设计模式 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理. 图 1. 代理模式 为了保持行为的一致性,代理类和委托类通常会实现相同的接口,所以在访问者看来两者没有丝毫的区别.通过代理类这中间一层,能有效控制对委托类对象的直接访问,也可以很好地隐藏和保护委托类对象,同时也为实施不同控制策略预留了空间,从而在设计上获得了更大的灵活性.Java 动态代理机制以巧妙的方式近乎完

java动态代理【一】

java动态代理的定义:为其他目标类的方法增加切面的逻辑,即在执行目标类方法的时候,先去执行一段如校验检测的逻辑代码.java通俗一点就是生成一个继承目标类的子类,并在每个调用方法都添加一段逻辑. 应用场景:当我们从别的项目迁移过来的代码进行修改的时候,如果有一个需求是当要执行某个业务类的所有方法前,需要校验其权限或其他的时候,如果这个类是源代码,我们还可以在类的基础上对每个方法区更改,但若是打包成jar包的类,若该类有接口还可以实现一个代理模式创建一个代理类,没有接口就比较麻烦,但接口一旦多起

Java 动态代理机制分析及扩展

引言 Java 动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类.代理类会负责将所有的方法调用分派到委托对象上反射执行,在分派执行的过程中,开发人员还可以按需调整委托类对象及其功能,这是一套非常灵活有弹性的代理框架.通过阅读本文,读者将会对 Java 动态代理机制有更加深入的理解.本文首先从 Java 动态代理的运行机制和特点出发,对其代码进行了分析,推演了动态生成类的内部实现. 代理:设计模式 代理是一种常用的设计模式,其

不用Unity库,利用.NET动态代理自己实现AOP

AOP意为面向切面的程序设计,主要表现为对不同的代码逻辑进行隔离,从而降低不同业务逻辑之间的耦合性,AOP又理解为“横切”,可以在不改变原有实现的情况下,对代码进行拦截和扩展,如果原有设计像一个瓶子,AOP就相当于一个贴纸,是贴在瓶子外面的,而不是打开瓶盖从瓶口把实现放进瓶子里. .NET中实现AOP的第三方库有很多,这里不再阐述了,在这里我们主要用到了.NET中的动态代理技术,为了让大家更深入地理解,这里借用一下上一篇文章(不用Unity库,自己实现.NET轻量级依赖注入)中的例子,在上一篇文