日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

Emit动态代理.NetCore迁移之旅

發布時間:2023/12/4 asp.net 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 平臺代碼遷移終于完成。

【總結】

  • Emit動態代理.NetStandard2.0 最低支持意味著支持.Net Core2.0/.Net Framework 4.6.1以上;

  • 微軟在Api的遷移中,對部分代碼進行了重新的歸類,但是很多地方對舊版本不兼容我,切沒有替換的官方文檔;

  • .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


    .NET社區新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com

    總結

    以上是生活随笔為你收集整理的Emit动态代理.NetCore迁移之旅的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。