【C】Natasha 插件编程
文章轉(zhuǎn)載授權(quán)級(jí)別:C
Natasha 是一個(gè)代替 Emit / Expression 的動(dòng)態(tài)構(gòu)建項(xiàng)目,旨在為開發(fā)者提供方便、快捷、高性能的動(dòng)態(tài)構(gòu)建服務(wù),動(dòng)態(tài)編程是生態(tài)的重要組成部分,希望開發(fā)者們能有足夠的興趣來了解、使用、建設(shè)它。
1、插件生成
使用 Natasha 進(jìn)行動(dòng)態(tài)編譯并生成 dll 和 pdb 文件;
//使用隨機(jī)域? //參數(shù)傳?true?將內(nèi)容編譯到 DLL 中 NDomain.Random(true).Action("Console.WriteLine(\"Hello World!\");");2、插件加載
前提插件結(jié)構(gòu):
Plugin?引用了?Dependency.dll 和?MySql.Data.dll
.NET Core 2.x?使用 Natasha 加載插件,建議手動(dòng)添加依賴。
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 依賴配置文件,因此不需要再一個(gè)一個(gè)的添加了。
AssemblyDependencyResolver?操作類僅對(duì)外提供兩個(gè)解析路徑的方法,若需要獲取引用文件的路徑,需要反射私有字段。
var?domain?=?DomainManagement.Random; domain.LoadStream("Plugin.dll");NDomain.Create(domain).Action("xxxx");?
?
3、運(yùn)行時(shí)動(dòng)態(tài)修改插件
在群里小伙伴的建議下,開了一個(gè)動(dòng)態(tài)修改插件的項(xiàng)目:https://github.com/night-moon-studio/DynamicPlugin ,結(jié)合 Natasha 出色的正編譯及插件功能 和 ILSpy 超強(qiáng)的反編譯功能,我們?cè)试S一個(gè)插件在運(yùn)行時(shí)加載之后進(jìn)行部分修改并重新編譯。
場景:前提插件 Plugin 包含有 A \ B \ C 三個(gè)類, 需求是在不改變類 A \ B 的情況下,修改 C 的代碼并重新生成插件,中間不能關(guān)閉程序。
Github 代碼中的例子結(jié)果對(duì)比圖:
對(duì)新舊 dll 反編譯查看(下為新),可以發(fā)現(xiàn) Natasha 在生成插件的同時(shí)對(duì)編譯代碼還進(jìn)行了優(yōu)化。
對(duì)其他類進(jìn)行對(duì)比查看,雖然反編譯里軟件中顯示了亂碼,實(shí)際上在運(yùn)行時(shí)得到的結(jié)果并沒有亂碼,得益于?ILSpy 對(duì) dynamic?的反解。
4、結(jié)尾
不太會(huì)說廢話,但唐突的結(jié)束不是很好,希望大家能多多吐槽我們的項(xiàng)目,多提建議,如果沒什么問題就去干吧,干就完了.
https://github.com/dotnetcore
打賞一杯酒,削減三分愁。
跟著我們走,脫發(fā)包你有。
組織打賞賬戶為檸檬的賬戶,請(qǐng)標(biāo)注「NCC」,并留下您的名字,以下地址可查看收支明細(xì):https://github.com/dotnetcore/Home/blob/master/Statement-of-Income-and-Expense.md
OpenNCC,專注.NET技術(shù)的公眾號(hào)
https://www.dotnetcore.xyz
微信ID:OpenNCC
長按左側(cè)二維碼關(guān)注
歡迎打賞組織
給予我們更多的支持
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的【C】Natasha 插件编程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Serverless那么火,2019年的
- 下一篇: 收藏!推荐12个超实用的Visual S