動態編譯庫 Natasha 5.0 版本發布

動態編譯庫 Natasha 5.0 于十月份發布,此次大版本更新帶來了強大的兼容性支持,目前 Natasha 已支持 .NET Standard 2.0 及 .NET Core 3.1 以上版本(包括 .NET Framework)了。

引入項目

NuGet\Install-Package?DotNetCore.Natasha.CSharp?-Version?5.0.0

引擎分離

從 Natasha 5.0 開始,將支持根據?TargetFramework?目標版本來適配對外 APIs,為開發者自動選擇提供單域編譯引擎多域編譯引擎

單域編譯引擎
  • 支持 .NET Standard 2.0(.NET Core 3.1 以下,以及.NET Framework)版本

  • 動態構建工作將在主域 Main Domain 中進行

  • 不具備多域編譯引擎帶來的優勢,也無法卸載動態編譯輸出的程序集

  • 簡化了部分 APIs,移除一部分不必要的 APIs,不兼容上一版本的 Natasha APIs

多域編譯引擎
  • 兼容 .NET Core 3.1 及以上版本(包括 .NET Core 和 .NET 5+)

  • 支持程序集卸載 Assembly Uninstall

  • 支持域功能隔離 Domain Functions Isolation

  • 支持插件加載與卸載 Plugin Load & Unload

  • 兼容上一版本的全部 Natasha APIs

代碼分離

Natasha 5.0 在源碼層面分為?MultiDomainPublic?和?SingleDomain?三部分,并使用自定義宏?MULTI?來區分單域與多域。

Natasha 5.0 從工程文件層面上做了兼容性隔離,確保 Natasha 在后續版本的升級中不必過多關注兼容性問題,多域編譯引擎依舊是 Natasha 未來版本的主要方向,后續的升級與優化工作也將在?MutliDomain?中開展。

如多域編譯引擎提供了如下接口:

{OperatorClass}.DefaultDomain/CreateDomain/RandomDomain/UseDomain

其對應的單域編譯引擎僅支持如下接口:

{OperatorClass}.DefaultDomain

單域編譯引擎的編譯結果會全部加載到主域當中,因此不具備域功能隔離與卸載能力。

使用須知

編譯前提

使用?字符串腳本?需要對編譯原理有一定程度的了解。Natasha 與 Roslyn 將為開發者極大地簡化了復雜的理論依據和構建過程。開發者在使用 Natasha 時需要關注以下問題:

一、元數據管理問題

熟悉?Emit/Expression?的開發者了解,在構建過程中可能會使用到反射(如?PropertyInfo、FieldInfo、MethodInfo?等信息)。由于許多開發者在編寫代碼時,只關注反射的使用,忽視了這些元數據對動態編譯的重要性,因此在通過字符串腳本進行編譯時,時常會出現各種問題。

Natasha 和 Roslyn 同樣需要元數據,而元數據的來源十分多樣,如引用程序集、內存程序集、實際程序集等。其中,除內存程序集外,元數據均被記錄在 DLL 文件中,因此當使用如下構建代碼時:

NatashaManagement.AddGlobalReference("1.dll");

可能會引發如下異常:

找不到 RuntimeMetadataVersion 的值。找不到包含 System.Object 的程序集,或未通過選項為 RuntimeMetadataVersion 指定值。

引用管理對于程序來講是具有一定負擔的,因為目前還不能從內存程序集中提取到元數據,所以需要以文件的方式來添加,這也就導致了開發者在發布動態編譯程序時,需要有完畢的引用文件跟隨 —— 將導致所發布的包體積變大。至于環境需要哪些引用文件,可以交由?NCC 編譯環境包來解決。如果開發者不能很好地管理引用,那么直接引入該包來全面覆蓋當前程序的元數據是最好的選擇。

二、Using 管理問題

Using 的管理關乎元數據的引用來源。任何一個動態構建,都是以一個完整類的方式進行的,因此完整的類?using?代碼是必不可少的。Natasha 構建模板目前可以覆蓋大部分?using,并能通過語義過濾來處理異常?using。如果開發者直接使用?AssemblyCSharpBuilder?來構建代碼,那么就需要注意腳本中的?using?問題。

編譯環境

編譯環境包目前已不再包含于 Natasha Package 中,因此需要使用以下方法來加載編譯環境:

  • 使用 Natasha 接口來管理全局引用與 Using 緩存

    NatashaManagement.AddGlobalReference/AddGlobalUsing
  • 使用 NCC 編譯環境包來解決元信息的引用問題

    DotNetCore.Compile.Environment
輸出環境

如果開發者認為生成的文件中有太多的多語言適配資源,那么可以使用?SatelliteResourceLanguages?來指定默認的資源語言:

<SatelliteResourceLanguages>en</SatelliteResourceLanguages>
二義性錯誤

二義性問題仍被歸屬到開發者的錯誤開發行為中,不應由 IDE 或 Natasha 來解決。Natasha 團隊傾向于在命名空間發生沖突時,由開發者手工解決該問題,Natasha 的上下文語義環境并不能百分之百地推斷出用戶究竟想用哪一個命名空間。

目前有三種解決方案可供開發者選擇:

  1. 使用?Natasha.CSharp.Extension.Ambiguity?擴展包,通過?.Using()?或?.ConfigUsing()?模板自帶的方法來指定優先級最高的?using?。該包將在不久之后將獨立并進入 Natasha 生態社區 NMS 之中;

  2. 直接使用引擎?AssemblyCSharpBuilder?編譯字符串腳本,在字符串層面進行替換;

  3. 定制語義過濾方法,更新編譯單元中的語法樹,使用 Natasha 的語義擴展方法,將自定義語義過濾方法添加到 Natasha 中:

    assemblyCSharpBuilder.AddSemanticAnalysistor(Func<AssembltCSharpBuilder,?CSharpCompilation,?CSharpCompilation>)

    (需要有語法語義相關開發經驗)

示例

一個盡可能復雜的示例:

var?action?=?NDelegate//使用隨機域?也可以使用?CreateDomain?/?UseDomain?/?DefaultDomain?
//Core3.1以下僅能使用?DefaultDomain
.DefaultDomain()//[可選API]?必要時使用?ConfigBuilder?配置編譯單元(下面只為展示API,?有需求就用,?沒需求不用寫)
.ConfigBuilder(builder?=>?builder//配置編譯器選項.ConfigCompilerOption(opt?=>?opt//配置平臺.SetPlatform(Microsoft.CodeAnalysis.Platform.AnyCpu)//Release?方式編譯.CompileAsRelease()//開啟可空警告.SetNullableCompile(Microsoft.CodeAnalysis.NullableContextOptions.Warnings))//配置語法選項.ConfigSyntaxOptions(opt?=>?opt//配置支持的腳本語言版本.WithLanguageVersion(Microsoft.CodeAnalysis.CSharp.LanguageVersion.CSharp8))//禁用語義檢查與過濾.DisableSemanticCheck()
)//[可選API]?配置該方法所在的類模板
.ConfigClass(item?=>?item//給類配置一個名字,不用隨即名.Name("myClass")//不使用默認域的?Using?緩存.NoGlobalUsing())//[可選API]?為類模板添加?using?引用
.ConfigUsing("System")//這里的?API?參照定義的委托,?包括委托的參數//例如?Action<int>?/?Func<int,int>?擁有一個參數,?參數的名字請在?Action<int>?/?Func<int,int>?上?F12?查看定義獲取參數名.
.Action("Console.WriteLine(\"Hello?World!\");");action();?/*Output:?Hello?World!*/

更新日志

2022/09/05 - 2022/09/21

  • 分離引擎,項目分為多域和單域以部分類方式合并 APIs

  • 使用?IndexOf?替代?Contans?方法做兼容

  • 支持 .NET Standard 2.0、.NET Core 3.1+ 以及 .NET 5+ 版本

  • 升級?DotNetCore.SourceLink.Environment?依賴,支持 .NET Standard 2.0/2.1 版本

  • 升級?DotNetCore.Compile.Environment?依賴,支持 .NET Standard 2.0/2.1 版本

2022/09/30 - 2022/10/09

  • 使用?Assembly.ReflectionOnlyLoad?替代?MetadataLoadContext?解決單域引擎只讀元數據的問題

  • 優化單域引擎初始化過程中掃描源 DLL 文件的問題

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/280803.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/280803.shtml
英文地址,請注明出處:http://en.pswp.cn/news/280803.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

著名軟件公司的java筆試算法題!(含參考答案)

原題如下&#xff1a;用1、2、2、3、4、5這六個數字&#xff0c;用java寫一個main函數&#xff0c;打印出所有不同的排列&#xff0c;如&#xff1a;512234、412345等&#xff0c;要求&#xff1a;"4"不能在第三位&#xff0c;"3"與"5"不能相連.…

django08: 視圖與路由(舊筆記)

視圖&#xff08;Views&#xff09; https://www.cnblogs.com/liwenzhou/articles/8305104.html 1.CBV和FBV 2.?????上傳文件示例 路由 https://www.cnblogs.com/liwenzhou/p/8271147.html 1.url正則表達 2.分組命名匹配&#xff08;參數&#xff09; 3.反向解析 …

【BZOJ1042】硬幣購物(動態規劃,容斥原理)

【BZOJ1042】硬幣購物&#xff08;動態規劃&#xff0c;容斥原理&#xff09; 題面 BZOJ Description 硬幣購物一共有4種硬幣。面值分別為c1,c2,c3,c4。某人去商店買東西&#xff0c;去了tot次。每次帶di枚ci硬幣&#xff0c;買s i的價值的東西。請問每次有多少種付款方法。 In…

ios 啟用 證書_如何在iOS 10中啟用就寢提醒,輕柔的喚醒和睡眠跟蹤

ios 啟用 證書If you have trouble regularly getting a full night’s sleep, the new Bedtime feature in iOS 10 might just help. Set a wake up time and how many hours of sleep you need, and iOS offers bedtime reminders, more gentle alarms, and basic sleep trac…

struts OGNL表達式

OGNLContext對象有兩部分構成 一部分是ROOT&#xff1a;可以放置任何對象作為ROOT 另外一部分Context&#xff1a;必須是Map形式&#xff08;鍵值對&#xff09; OGNL表達式操作 package cn.future.a_ognl;import java.util.HashMap; import java.util.Map;import ognl.Ognl; i…

纖程(FIBER)

Indy 10 還包含對纖程的支持。纖程是什么&#xff1f;簡單來說&#xff0c;它也是 一個“線程”&#xff0c;但是它是由代碼控制的&#xff0c;而不是由操作系統控制的。實際上&#xff0c;可以認為線程 是一個高級纖程。纖程和 Unix 用戶線程(Unix user threads)很相似。 線程…

制作一個用戶頭像選擇器仿 WeGame

制作一個用戶頭像選擇器仿 WeGameCropAvatar作者&#xff1a;WPFDevelopersOrg - 驚鏵原文鏈接&#xff1a;https://github.com/WPFDevelopersOrg/WPFDevelopers框架使用.NET40&#xff1b;Visual Studio 2019;制作一個用戶頭像選擇Canvas為父控件所實現&#xff0c;展示圖片使…

PS2019進階筆記(二)

云端網校筆記&#xff08;PS2015&#xff09; 一、圖層混合模式 圖層面板上的左上角&#xff0c;默認正常 混合下面圖層&#xff0c;下面正片&#xff08;如模特&#xff09;。 最常用是&#xff1a;不透明度 溶解&#xff1a;需調節透明度 變暗組&#xff1a; 亮區域去除…

Html5里frameSet不在使用的替代方法,使用ifram

原來得使用方式&#xff1a; <frameset rows"100,*" frameborder"0"><frame name"header" src"header.aspx"></frame><frameset cols"15%, *"><frame name"menu" src"left.aspx&…

網曝南方電網搞末位淘汰和裁員,給各下屬單位強制規定辭退率和降崗降級率!...

電網作為壟斷性國企&#xff0c;在人們心中一向是好單位的代名詞&#xff0c;但最近卻有網友曝光南方電網搞末位淘汰和裁員&#xff0c;給各單位下了辭退率和降崗降級率&#xff0c;每個單位都要開除一部分人&#xff0c;或者把一部分人崗級降下來。有南方電網員工馬上跑出來辟…

二維數組中的查找

2019獨角獸企業重金招聘Python工程師標準>>> 題目 在一個二維數組中&#xff0c;每一行中的數都按照從左到右、從上到下的遞增順序排列。要求輸入一個整數&#xff0c;判斷數組中是否存在該整數 實現代碼 function find($matrix, $rows, $columns, $key) {//TODO 參…

C# JObject轉換JSON文件相關處理

一、JObject.Parse 1.把整個json文件字符串轉化成JObject格式。 JObject jsonData JObject.Parse(jsonString); 2.逐級轉換成JObject 最低級是"Device": "Windowsr"&#xff0c;字典。 jsonData JObject.Parse(jsonData[jsonName][jsonIndex].ToStr…

通過修改然后commit的方式創建自己的鏡像

創建自己的鏡像&#xff1a;通過現有的鏡像來創建自己的鏡像。1、首先拉取一個鏡像到本地$ sudo docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEubuntu 12.04 5b117edd0b76 11 months…

hdu6103[尺取法] 2017多校6

/*hdu6103[尺取法] 2017多校6*/ #include <bits/stdc.h> using namespace std; int T, m; char str[20005]; void solve() {int ans 0;int n strlen(str);for (int i 0; i < n; i) {int l 0, r 0, p1 i, p2 i 1, cost 0;while (p1 - r > 0 && p2 …

藍牙追蹤_如何使用藍牙追蹤器跟蹤您的東西

藍牙追蹤We’ve all done it: you misplace something important and you spend a lot of time (with a lot of stress) backtracking to locate it again. With Bluetooth tracking devices you can make the hunt a lot easier, less stressful, and even avoid losing the t…

遠程訪問CENTOS的MYSQL數據庫設置

遠程訪問CENTOS的MYSQL數據庫設置 mysql -u root grant all privileges on *.* to root%identified by root; 后面的root是root用戶的密碼 grant all privileges on *.* to rootlocalhostidentified by root; mysql -u root -p

ShardingCore 7.0 版本發布

NCC ShardingCore 是一款 EntityFramework Core based 高性能、輕量級、分表分庫、讀寫分離解決方案&#xff0c;具有零依賴、零學習成本、零業務代碼入侵等特點。ShardingCore 7.0 已于近期發布。從 ShardingCore 7.0 開始&#xff0c;啟用版本號第二位來對應不同的 EFCore 版…

搬運 centos7.2 apache 綁定二級目錄 訪問依然是apache頁面

<VirtualHost *:80>ServerName xx.comDocumentRoot /var/www/html/xx</VirtualHost> 轉載于:https://www.cnblogs.com/kiimi/p/8662490.html

django09: ORM以及CSRF(舊筆記)

ORM相當于程序里的數據庫操作 ORM(一) https://www.cnblogs.com/liwenzhou/p/8688919.html ORM(二) https://www.cnblogs.com/liwenzhou/p/8660826.html CSRF:防止網站請求偽造&#xff0c;即釣魚網 在Form表達添加&#xff1a;{% csrf_toker %}

vba發送郵件 簽名_如何更改“從Windows 10的郵件發送”簽名

vba發送郵件 簽名The Windows 10 Mail app is a decent email client that allows you to add other email accounts in addition to your Microsoft accounts. You’ll notice, though, that any emails you write in the Mail app have a default signature. Windows 10 Mail…