【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 插件编程相关推荐
- 20.QT中插件编程
插件编程 插件可以理解为动态库,一种固定接口的动态库.以下摘自网友的理解.代码参考自官方示例. Qt插件本身是动态库,除此之外,它定义了一组专用的接口,从动态库中导出,供 Qt 的插件管理体系 发现和 ...
- C#联合halcon框架实现插件编程 运动控制卡 多工具 测量 九点标定全新
C#联合halcon框架实现插件编程 运动控制卡 多工具 测量 九点标定全新 ,用于学习很nice,适合新手 编号:6937662632121279小鲤鱼历险记
- MAYA API插件编程--入门篇
MAYA API插件编程--入门篇 作者:华文广 日期:2010.11.28 我们知道,MAYA是一个基于结点的插件式软件架构,这种开放式的软件架构是非常优秀的,它可以让用户非常方便 ...
- Visual Studio 2005 插件编程(代码行数统计插件)之一
原文:http://www.codeproject.com/useritems/LineCounterAddin.asp 注意:1.本文中的提到的"外接程序"等同与"插件 ...
- 最标准最简洁的通达信DLL股票插件编程开发流程
[简介] 常用网名: 猪头三 出生日期: 1981.XX.XX 个人网站: https://www.x86asm.org Email: 643439947@qq.com QQ交流: 643439 ...
- 通达信 python插件选股_[转载]通达信插件选股(基于通达信插件编程规范的简单分析)...
首先声明,鄙人是编程人员,不是股民.对选股概念了解甚少.本文仅作编程人员学习借鉴之用.不对选股理论进行探讨和解释. 以前有客户找我做过通达信插件选股的小任务,当时第一次接触面向接口(此类"接 ...
- Windows Mobile智能手机今日插件编程开发初探(使用C++, vs2008, Pocket PC 5.0内核)
我很久以前写的一篇文章,现在转移到这里. 前天突发灵感认为如果能做一个在手机桌面上的每日问候程序一定会很有意思,于是开始了Pocket PC 今日插件(today plugin)编程的学习和研究. 受 ...
- Microsoft Visual Studio + Qt插件编程出现错误error MSB4184问题
今天发现一个问题,VS2017+qt插件,Debug模式下出现错误(Release模式没有问题): C:\Users\Administrator\AppData\Local\QtMsBuild\qt_ ...
- .Net插件编程模型:MEF和MAF
原文地址:https://blog.csdn.net/ghostbear/article/details/7328462
最新文章
- 大数据解决方案背后——开放架构才是未来
- Mac安装python3的opencv包
- 【快乐水题】520. 检测大写字母
- MATLAB常用命令、函数与运算
- 2018 ICPC Asia Jakarta Regional Contest J. Future Generation 状压dp
- Taro+react开发(95):问答模块02
- 俄罗斯农民乘法 | 快速乘
- leetcode - Linked List Cycle
- 移动端HTML5框架
- 2016十大优秀jQuery插件推荐
- virtual hust 2013.6.20 数论基础题目 E - Uniform Generator
- 使用VIsio绘制E-R图
- 【知识点】patch补丁文件格式
- 地理信息系统实习教程 第26章 地图注记
- 《三国演义》里到底描写了多少个人物,你知道吗?
- 使用Modular QoS CLI(MQC)基于FR的DLCI号对包进行分类
- 优酷播放黑科技 | 基于WebRTC实现的直播“云多视角“技术解析
- C/C++开3次方函数cbrt
- Android HOME键那些事
- 高德地图H5 定位失败报错 geolocation time out. Get ipLocation failed解决方案