zoukankan      html  css  js  c++  java
  • 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 即可;

  • 相关阅读:
    c/c++ 网络编程 getaddrinfo 函数
    c/c++ 网络编程 bind函数
    c/c++ socket API 调用后的错误判断 perror errno
    python基础-面向对象编程之反射
    彻底理解Future模式
    Java并发编程:Callable、Future和FutureTask
    java异步调用方法
    理解ThreadLocal
    ReentrantReadWriteLock读写锁
    java锁优化
  • 原文地址:https://www.cnblogs.com/7tiny/p/9710406.html
Copyright © 2011-2022 走看看