【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 的代碼并重新生成插件,中間不能關閉程序。
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 插件编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Serverless那么火,2019年的
- 下一篇: .NET Core 在 K8S 上的开发