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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【C】Natasha 插件编程

發布時間:2023/12/4 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【C】Natasha 插件编程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章轉載授權級別:C

Natasha 是一個代替 Emit / Expression 的動態構建項目,旨在為開發者提供方便、快捷、高性能的動態構建服務,動態編程是生態的重要組成部分,希望開發者們能有足夠的興趣來了解、使用、建設它。

1、插件生成

使用 Natasha 進行動態編譯并生成 dll 和 pdb 文件;

//使用隨機域? //參數傳?true?將內容編譯到 DLL 中 NDomain.Random(true).Action("Console.WriteLine(\"Hello World!\");");

2、插件加載

前提插件結構:

Plugin?引用了?Dependency.dll 和?MySql.Data.dll

.NET Core 2.x?使用 Natasha 加載插件,建議手動添加依賴。

var?domain?=?DomainManagement.Random; domain.LoadStream("Plugin.dll"); domain.LoadStream("Dependency.dll"); domain.LoadStream("MySql.Data.dll");NDomain.Create(domain).Action("xxxx");

.NET Core3.x?官方在 core3.x 后提供了 AssemblyDependencyResolver 操作類來解析 deps.json 依賴配置文件,因此不需要再一個一個的添加了。

AssemblyDependencyResolver?操作類僅對外提供兩個解析路徑的方法,若需要獲取引用文件的路徑,需要反射私有字段。

var?domain?=?DomainManagement.Random; domain.LoadStream("Plugin.dll");NDomain.Create(domain).Action("xxxx");

?

?

3、運行時動態修改插件

在群里小伙伴的建議下,開了一個動態修改插件的項目:https://github.com/night-moon-studio/DynamicPlugin ,結合 Natasha 出色的正編譯及插件功能 和 ILSpy 超強的反編譯功能,我們允許一個插件在運行時加載之后進行部分修改并重新編譯。

場景:前提插件 Plugin 包含有 A \ B \ C 三個類, 需求是在不改變類 A \ B 的情況下,修改 C 的代碼并重新生成插件,中間不能關閉程序。

//當插件使用deps.json依賴文件時 ReWriter reWriter = new ReWriter(dllPath); reWriter["C"] = "using xxxx; namespace xxx{public class C{ ...... }}"; reWriter.Complier(); reWriter.Dispose(); return?reWriter.NewDllPath; //當插件不適用deps.json文件,且所有依賴文件都在同一目錄時 ReWriter?reWriter?=?new?ReWriter(dllPath,false); //添加額外引用DLL reWriter.References.Add("MySql.Data.dll"); reWriter.References.Add("xxxx.dll"); reWriter["C"]?=?"using?xxxx;?namespace xxx{public?class?C{?......?}}"; reWriter.Complier(); reWriter.Dispose(); return reWriter.NewDllPath;

Github 代碼中的例子結果對比圖:

對新舊 dll 反編譯查看(下為新),可以發現 Natasha 在生成插件的同時對編譯代碼還進行了優化。

對其他類進行對比查看,雖然反編譯里軟件中顯示了亂碼,實際上在運行時得到的結果并沒有亂碼,得益于?ILSpy 對 dynamic?的反解。

4、結尾

不太會說廢話,但唐突的結束不是很好,希望大家能多多吐槽我們的項目,多提建議,如果沒什么問題就去干吧,干就完了.


https://github.com/dotnetcore

打賞一杯酒,削減三分愁。
跟著我們走,脫發包你有。

組織打賞賬戶為檸檬的賬戶,請標注「NCC」,并留下您的名字,以下地址可查看收支明細:https://github.com/dotnetcore/Home/blob/master/Statement-of-Income-and-Expense.md

OpenNCC,專注.NET技術的公眾號

https://www.dotnetcore.xyz

微信ID:OpenNCC

長按左側二維碼關注

歡迎打賞組織

給予我們更多的支持

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的【C】Natasha 插件编程的全部內容,希望文章能夠幫你解決所遇到的問題。

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