最新要闻
- 【快播报】安全头盔是个宝 骑乘人都要佩戴好
- 知名男演员李光洁跟电诈团伙打36分钟电话:半天才发现破绽
- 当前时讯:减重近一吨 我国首辆镁合金轻量化挂车交付
- 手机/PC双端互通!米哈游《崩坏:星穹铁道》预下载开启:4月26日上线
- 实拍“星舰”发射失败后现场:发射台报废、地面影像设备尽毁|世界焦点
- 最强拍照折叠屏!小米MIX Fold 3规格曝光:用上一英寸IMX989
- 打哈欠真的会传染吗 环球快看点
- 科创板首批“重大违法退”锁定,注册制下退市生态加速构建 世界独家
- 厦门钨业于云南新设科技发展子公司:企查查APP显示,近日,云南厦钨科技发展有限公司成立,注册资本100万元,经营范围包含 全球热文
- 全球热头条丨电池原材料价格大跌坑到宁王?宁德时代回应
- 天天快讯:每小时1000公里 !我国“高速飞车”研制取得新进展
- 每日热讯!马斯克请回来的4D成像雷达 百度小米蔚来也押注了:战况很激烈
- 《天宫之镜》上线:首次慢直播中国空间站-天天实时
- 每日焦点!同飞股份4月24日盘中涨幅达5%
- 最后时刻单防福克斯!追梦:如果这让你感觉不好 我很抱歉
- 北京国际电影节有哪些看点?
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
Natasha 编译单元(四)_世界快资讯
AssemblyCSharpBuilder
最基本编译单元,涵盖了编译流程所需的基本功能,包括创建域,加载dll文件,创建各种类,输出路径更换,调用特定域中的方法等。
Natasha有两种方式编译流程,一种就是AssemblyCSharpBuilder ,相比较而言,它是轻量级的,个人怀疑另一种编译流程的底层也是使用了AssemblyCSharpBuilder 。
引用NuGet:DotNetCore.Natasha.CSharp
(资料图片仅供参考)
编译单元基本举例
NatashaManagement.Preheating();//创建一个变量,用于参数带入和后期的参数比较String key = "HelloWorld";// 创建一个Test类,类中添加了一个变量和一个静态方法// 变量为key值,静态方法中放回声明的key值string code = "public class Test{" + "public string Name=\"" + key + "\"; " + "public static string GetName(){ " + " return (new Test()).Name; " + "}" + "}";// 创建了一个myDomain域,指定了该域的使用范围using (DomainManagement.Create("myDomain").CreateScope()){ // 声明基础编译单元 AssemblyCSharpBuilder builder = new(); // 添加code builder.Add(code); ///////////////调用使用////////////////////////////////// // 获得Test类的GetName方法 var func = builder.GetDelegateFromShortName
>("Test", "GetName"); // 调用GetName方法,并返回 String result = func(); // 判断返回值是否与key相同 if (key.Equals(result)) { //相同 System.Console.WriteLine("匹配"); } else { // 不同时返回result数值,可查看为什么不同 System.Console.WriteLine($"不匹配:{result}"); }} 返回结果:
AssemblyCSharpBuilder相关属性方法
属性
Domain 编译单元所在域
为什么要着重描述域的概念?当代码量越来越大,所需的插件逐渐增多时,一旦引用版本出现问题,会给程序本身带来灾难,而且一旦全部引用,程序所占的内存也是灾难级的。例如我们加载了两个不同平台版本的相同dll,调用时,系统无法判断我们应该用哪个,特别是两个版本的dll方法不同时,都无法判定哪里错了。例如java中使用maven去管理版本,vue使用npm管理版本一样,而域中的版本管理也很重要。
建议:
1.写代码时,就要设计好引用管理问题,不然日积月累,会越来越臃肿
2.建议类似maven的pom一样管理dll版本,这样不至于导致版本引用混乱
3.划分不同的域,每个域用反射调用,主要用于解耦。
4.封装每个域,让每个域成为独立的个体,完全解耦,适用于独立功能,功能简单的情况
5.在LoadPluginWith**Dependency 时进行依赖引用判断
LoadPluginWithAllDependency ("*.dll", asmName=>{依赖列表,返回true为不包含,false为包含})。
为空时先从上下文中获得,如上文例子中的myDomain域,当上下文也为空,则设置为:NatashaReferenceDomain.DefaultDomain。
Domain为NatashaReferenceDomain类,因该类重载了AssemblyLoadContext类,因此会有基类的特性:
LoadFromStream和LoadAssemblyFromFile等方法
加载文件流或文件到该域中,也可以加载Natasha生成的相关文件
当域中存在相同的文件时,直接跳过。
当遇到相同文件时,希望可以选择,则可以使用下列方法
LoadPluginWithAllDependency [全加载]
LoadPluginWithHighDependency[高版本加载]
LoadPluginWithLowDependency [低版本加载]
LoadPluginUseDefaultDependency[使用主域版本]
DllFilePath,PdbFilePath,XmlFilePath
生成的dll,pdb,xml文件的路径地址,绝对路径
DefaultUsing.UsingScript 可以添加默认的引用
方法
引用相关方法
// LoadBehaviorEnum// UseHighVersion使用高版本//UseLowVersion使用低版本// 当编译后加载程序集时,程序集中依赖存在高版本,则使用高版本依赖CompileWithAssemblyLoadBehavior(LoadBehaviorEnum.UseHighVersion) // 当合并引用时,引用列表中存在高版本, 则使用高版本引用 CompileWithReferenceLoadBehavior(LoadBehaviorEnum.UseHighVersion)// 引用过滤逻辑 CompileWithReferencesFilter((defaultAsmName, targetAsmName)=> LoadVersionResultEnum.UseDefault)
更改输出路径
// 参数可以更换目录builder.UseNatashaFileOut();builder.SetDllFilePath(path); //设置生成的 DLL 文件路径 c:/1.dllbuilder.SetPdbFilePath(path); //设置生成的 PDB 文件路径 c:/1.pdbbuilder.SetXmlFilePath(path); //设置生成的 XML 文件路径 c:/1.xml
配置编译器参数
目前水平碰不得
ConfigCompilerOption(opt => { });
配置语法树
目前水平碰不得
ConfigSyntaxOptions(opt => opt)
语义过滤器(委托)
参数一和参数二返回一个参数二一致的类型
AddSemanticAnalysistor((currentBuilder, currentCompiler) => currentCompiler)
这个感觉知道就好,一般用不到
builder1.AddSemanticAnalysistor((build, compla) =>{ // 重新创建了一个Test的动态编译 var complation = CSharpCompilation.Create("Test") // 添加本地资源 .AddReferences( MetadataReference.CreateFromFile( typeof(object).Assembly.Location) ) // 添加编译代码 .AddSyntaxTrees(CSharpSyntaxTree.ParseText("public class A {public String Hello(){return \"Hello\"}}")) // 添加配置项 .WithOptions(new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)); return complation;});
清除所有语义过滤器
ClearInnerSemanticAnalysistor
内部实际调用UsingAnalysistor._usingSemanticDelegate,在我理解就是删除了语义委托的缓存
添加代码
Add(String code)添加脚本
Add(SyntaxTree tree) 添加语法树,例如:CSharpSyntaxTree.ParseText
获取编译后的动态程序集
GetAssembly获得Assembly
获得Assembly后可获得相关信息
通过Assembly.GetType()获得具体类型信息,也可通过Activator.CreateInstance()进行实例化
获取到类型
直接获得类型
GetTypeFromShortName("Test")
GetTypeFromFullName("xxNamespace.xxClassName")
已知问题
摘自官网
- 缺少引用文件报错 NatashaException:“找不到 RuntimeMetadataVersion 的值。找不到包含 System.Object 的程序集,或未通过选项为 RuntimeMetadataVersion 指定值。”
- 使用
NatashaManagement.AddGlobalReference();
来手动添加默认域的引用文件. - 使用
domain.LoadAssemblyFromFile / LoadPluginXXXDependency
来手东添加其他域的引用文件.
- 使用
- 缺少 Using 引用;
- 使用
NatashaManagement.AddGlobalUsing("mynamespace")
来手动添加全局 using. - 使用
domain.UsingRecorder.Using("mynamespace")
来手动添加其他域的 using.
- 使用
关键词:
chatgpt~插件介绍
为什么你永远不应该在CSS中使用px来设置字体大小-今日关注
Natasha 编译单元(四)_世界快资讯
【快播报】安全头盔是个宝 骑乘人都要佩戴好
知名男演员李光洁跟电诈团伙打36分钟电话:半天才发现破绽
当前时讯:减重近一吨 我国首辆镁合金轻量化挂车交付
手机/PC双端互通!米哈游《崩坏:星穹铁道》预下载开启:4月26日上线
实拍“星舰”发射失败后现场:发射台报废、地面影像设备尽毁|世界焦点
最强拍照折叠屏!小米MIX Fold 3规格曝光:用上一英寸IMX989
打哈欠真的会传染吗 环球快看点
科创板首批“重大违法退”锁定,注册制下退市生态加速构建 世界独家
Anki 无需网络如何同步 手机和电脑进行同步
盘点| 有哪些比较新的好用的React Native 开发工具? 天天最新
快看点丨技术干货|如何利用 ChunJun 实现数据实时同步?
当前快看:python工具模块介绍-time 时间访问和转换
厦门钨业于云南新设科技发展子公司:企查查APP显示,近日,云南厦钨科技发展有限公司成立,注册资本100万元,经营范围包含 全球热文
全球热头条丨电池原材料价格大跌坑到宁王?宁德时代回应
天天快讯:每小时1000公里 !我国“高速飞车”研制取得新进展
每日热讯!马斯克请回来的4D成像雷达 百度小米蔚来也押注了:战况很激烈
《天宫之镜》上线:首次慢直播中国空间站-天天实时
每日焦点!同飞股份4月24日盘中涨幅达5%
焦点报道:C#用dynamic一行代码实现反射操作
最后时刻单防福克斯!追梦:如果这让你感觉不好 我很抱歉
北京国际电影节有哪些看点?
最新:美国迪士尼乐园13米巨龙起火 观众还以为是新节目
全球速看:酷派COOL30 Pro来了:LCD水滴屏+2.4GHz八核CPU
特斯拉市值一周蒸发逾5000亿 分析师补刀:还能跌85%
一加Ace 2原神定制礼盒太火爆!3699元首销售罄
新资讯:全球连线|菲律宾榴莲加速进军中国
SpringSecurity框架教程-简介与SpringSecurity框架教程-入门案例准备工作_每日简讯
每日视讯:顶象推出应用隐私合规检测服务
如何用 DataTester 设计并创建可视化实验-全球微速讯
焦点观察:国泰4月24日起送2.7万张免费机票,附参加方法
天天热文:漯河郾城区新店镇:打好“三张牌” 聚力招商引资新突破
今日热闻!14款新车哪个最拉胯?中保研新一轮测试成绩公布:结果惊人
简讯:公司招聘运营称已婚双休未婚单休 求职者称歧视:网友热议没啥问题
宏碁发布史上最强迷你机圣盾X:i9-13900KS、RTX 4090无可挑剔|世界看热讯
微星推新BIOS限制7000X3D系列CPU电压 避免CPU毁损风险|天天视讯
世界快看点丨汽车级磷酸铁锂 针刺不起火!绿联、比亚迪户外电源3699元新低
新恒结衣的垣怎么念?新垣结衣个人介绍
中国第二大城市是哪个?中国第二大城市介绍
批准为荷是什么意思?批准为荷和批准为盼哪个更好?
孔雀蓝是什么颜色?孔雀蓝的rgb色值是多少?
任务管理器中的进程是什么意思?任务管理器中的进程怎么关闭?
MP3音乐文件破损是什么原因?MP3音乐文件破损怎么修复?
高血压的症状表现有哪些?高血压怎么调理才能彻底根除?
痛风一般有哪些症状?痛风会导致哪些严重后果?
可以用鼠标在电脑上写字的软件有哪些?怎么用鼠标拖动改变工作表标签的先后位置?
千与千寻迅雷下载 720p_千与千寻迅雷下载链接|环球快讯
Linux下Nginx安装证书_世界热门
2023最新kali安装教程 头条
分享一波免费可用的 API 大全|每日视点
笔记本怎么下载软件到桌面?笔记本怎么下载播放器?
环球今亮点!吃烧烤不应成为一场“战斗” 淄博在激流中需要保持清醒
世界球精选!一季度全国城镇新增就业297万人
环球滚动:景区完成特种设备隐患排查
全球热资讯!努比亚Z50把骁龙8 Gen2干到2500以内!倪飞:这才是旗舰焊门员
30寸巨屏+怀挡!别克全新君越内饰亮相:整车改头换面|报道
普通百姓也能用卫星遥感技术!这款手机APP快来了
全球观速讯丨李想:个人本意反对哨兵模式、延迟数月推出因考虑兼容车型
买了都说好!楠木之舟一体成型EVA拖鞋狂促:立省25元_环球视讯
归母净利润增幅超125% 铝合金精密压铸件龙头企业美利信登陆A股 最新快讯
使用nodejs编写api接口并部署到服务器上-前沿资讯
防伪底纹制作教程(防伪底纹制作)
Mysteel:家电原材料周报(4.17-4.21) 世界焦点
全球观焦点:比亚迪驱逐舰07动力信息曝光:加速7.9秒、亏电百公里油耗3.9升
每日报道:五一民宿现涨价毁约潮 房东各种奇葩借口:专家称构成欺诈可退一赔三
【新要闻】淄博烧烤小饼遭疯抢:老板因太忙暴瘦20斤
三摄镜头模组瞩目!大疆Mavic 3 Pro外观细节现身
世界聚焦:首次!中国绘制火星全球影像图发布:国内名镇上火星
成分股是什么意思在哪里能看到_成分股是什么意思-焦点精选
今日热文:年薪70万的全栈需要什么技能?
今日热门!证监会承接企业债发行审核职责落地
播报:“在香港生仔要够胆”?香港为“生育率全球最低”想招
小米空调突破性技术创新:获评国际领先
降价800元!华为Mate 50系列更新:鸿蒙更丝滑、4G信号比苹果13更快了
核污水马上排海!还敢吃海鲜吗 日本在售海豚肉测出汞含量超标近百倍 当前最新
鱼干的做法家常做法大的鱼干_鱼干的做法
企业债发审职责划转无缝衔接 证监会核发首批注册批文
每日信息:【国际大宗商品早报】农产品及金属期价全线下跌 国际油价震荡收涨
【读财报】3月上市猪企业绩向好:牧原、温氏销量领先 唐人神收入同比翻倍
广西壮族自治区宾阳县发布暴雨红色预警
老鼠半夜按门铃输密码吓坏房主 网友直呼不可思议:老鼠成精了|当前速看
环球报道:你在城市待遇如何?一季度全国居民收入榜出炉:12个省份跻身“万元户”
赢麻!美公司高管狂赞坐中国高铁比坐飞机还好:马斯克力挺-当前滚动
iPadOS 17支持设备清单曝光:多款经典机型被抛弃
bill to 环球新视野
学系统集成项目管理工程师(中项)系列11a_沟通管理(上)|每日关注
CSA动态 | 这个航天日,青年如何相聚?2023年中国宇航学会“青聚巢湖”青年科学家论坛即将开讲!
显示器屏幕为何越来越扁?原因找到了
暇日过在伯因而留饭_对于暇日过在伯因而留饭简单介绍 世界微速讯
全球观天下!cobalt strike渗透框架
【视频版】基于飞腾芯片的设计与调试入门指导-环球快资讯
软件工程基础作业——原型设计
【天天播资讯】Koordinator 一周年,新版本 v1.2.0 支持节点资源预留,兼容社区重调度策略
RTX 4090买一送一?满满都是套路啊
知名游戏网站VGtime最后3名编辑被开除:与资方冲突 不同意脚本取代原创 世界观天下
咸肉菜饭的做法_方法你学会了吗
环球新动态:法治微评:全力整治饭圈文化,严禁劣迹艺人随意变相复出捞金
爱书之人写给书的情歌-要闻