news 2026/6/10 18:42:26

C#动态代码最近实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C#动态代码最近实践

使用动态代码后发现内存暴涨, 修复后,最近实践代码如下:
// 关键是这里, 实现了baseScript复用, 否则每次调用内存都会大幅增长, 容易奔溃
var newScript = baseScript.ContinueWith(code);

usingMicrosoft.CodeAnalysis.CSharp.Scripting;usingMicrosoft.CodeAnalysis.Scripting;publicclassDynamicCode{// 创建脚本选项,添加引用和导入(按需), 使用静态, 复用privatestaticScriptOptionsscriptOptions=ScriptOptions.Default.WithReferences(typeof(List<>).Assembly,typeof(ISqlSugarClient).Assembly,typeof(ZXing.BarcodeFormat).Assembly,typeof(SixLabors.ImageSharp.Image).Assembly,typeof(ZXing.ImageSharp.BarcodeWriter<>).Assembly).WithImports("System","System.Collections.Generic","System.Linq","System.IO","System.Linq.Expressions","System.Threading.Tasks","Newtonsoft.Json.Linq","Yitter.IdGenerator","SqlSugar","Admin.NET.Core","System.Text.RegularExpressions","Newtonsoft.Json","ZXing.Common","ZXing.ImageSharp","SixLabors.ImageSharp","SixLabors.ImageSharp.Formats.Png","SixLabors.ImageSharp.PixelFormats");// 导入命名空间privatestaticScriptbaseScript=CSharpScript.Create("",options:scriptOptions,globalsType:typeof(CSharpScriptGlobals4Print));/// <summary>/// 执行动态C#代码获取数据源/// funBody举例/// var funBody = @"var obj = db.Queryable<BasPrint>().ToList(); return new {list=obj};/// </summary>protectedasyncTask<dynamic>QueryDataWithFunBody(stringfunBody,stringp1,dynamicp2){Log.Warning($"QueryDataWithFunBody p1={p1}");Log.Warning($"QueryDataWithFunBody p2={JSON.Serialize(p2)}");Log.Warning($"QueryDataWithFunBody funBody={funBody}");if(string.IsNullOrWhiteSpace(funBody)){returnnew{};}// 创建脚本运行时,并传入全局变量varnewDb=db.CopyNew();// 创建一个新的数据库连接varutils=newCommonUtils();// 创建脚本运行时,并传入全局变量varglobals=newCSharpScriptGlobals4Print{_db=newDb,utils=utils,_p1_=p1,_p2_=p2,};stringcode=$@"public dynamic Multiply(ISqlSugarClient db, string p1, dynamic p2) {{{funBody}}} Multiply(_db, _p1_, _p2_) ";try{varnewScript=baseScript.ContinueWith(code);// 关键是这里, 实现了baseScript复用, 否则每次调用内存都会大幅增长, 容易奔溃varscriptState=awaitnewScript.RunAsync(globals);// 传入变量, 执行动态代码if(scriptState.ReturnValue!=null){varresult=scriptState.ReturnValue;Log.Warning($"QueryDataWithFunBody data={result}");returnresult;}else{Log.Warning($"QueryDataWithFunBody 没有返回值");returnnull;}}catch(CompilationErrorExceptionex){Log.Error("编译错误[QueryDataWithFunBody]",ex);throwOops.Oh($"编译错误[QueryDataWithFunBody]<br>{ex.Message}");}catch(Exceptionex){Log.Error("执行错误[QueryDataWithFunBody]",ex);throwOops.Oh($"执行错误[QueryDataWithFunBody]<br>{ex.Message}");}}}publicclassCSharpScriptGlobals4Print{publicISqlSugarClient_db;publicCommonUtilsutils;publicstring_p1_;publicdynamic_p2_;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 9:15:49

Instagram 创作者变现指南(2026):从内容到收入的实战路径

过去&#xff0c;很多人把 Instagram 当成“发图平台”&#xff1b;而在 2026 年&#xff0c;它更像是一个完整的商业渠道&#xff0c;你可以在这里获取流量、建立信任、并最终实现变现。随着 Reels 的持续放量、品牌合作模式成熟&#xff0c;以及多账号矩阵的普及&#xff0c;…

作者头像 李华
网站建设 2026/6/10 9:15:11

探索大数据领域数据中台的实时处理能力

探索大数据领域数据中台的实时处理能力 关键词:数据中台、实时处理、流批一体、低延迟计算、大数据架构 摘要:在“秒级决策”成为企业核心竞争力的今天,数据中台的实时处理能力就像“商业世界的心跳监测仪”,能让企业实时感知业务脉搏。本文将从生活场景切入,用“早餐店升…

作者头像 李华
网站建设 2026/6/10 9:15:48

Java实习模拟面试实录:致远互联一面高频考点全解析 —— Spring MVC、线程安全、AOP、分库分表、MySQL优化一网打尽!

Java实习模拟面试实录&#xff1a;致远互联一面高频考点全解析 —— Spring MVC、线程安全、AOP、分库分表、MySQL优化一网打尽&#xff01; 前言&#xff1a;本文还原了笔者参加致远互联&#xff08;Seeyon&#xff09;Java实习生岗位的一轮技术面试全过程。作为国内知名协同办…

作者头像 李华
网站建设 2026/6/10 9:12:55

《P3157 [CQOI2011] 动态逆序对》

题目描述对于序列 a&#xff0c;它的逆序对数定义为集合{(i,j)∣i<j∧ai​>aj​}中的元素个数。现在给出 1∼n 的一个排列&#xff0c;按照某种顺序依次删除 m 个元素&#xff0c;你的任务是在每次删除一个元素之前统计整个序列的逆序对数。输入格式第一行包含两个整数 n…

作者头像 李华
网站建设 2026/6/10 9:15:47

如何在Android上恢复已删除的联系人

不幸的是&#xff0c;您的联系人有时会被意外地从Android设备中删除。失去联系人可能会给您的个人和职业生活带来许多不便。在这种情况下&#xff0c;您可能想知道如何在Android设备上恢复已删除的联系人。本文将全面讨论如何在Android手机上恢复已删除的联系人。 第 1 部分&am…

作者头像 李华
网站建设 2026/6/10 2:18:39

Native AOT 能改变什么?.NET 预编译技术深度剖析

当面试官问怎么缩小.NET发布后的文件体积、去掉多余依赖呢&#xff1f;想起了AOT,那么提到AOT首先要了解JIT。 长期以来&#xff0c;大多数 .NET 应用都依赖 即时编译&#xff08;JIT&#xff0c;Just-In-Time&#xff09; 机制运行。也就是说&#xff0c;程序发布时是中间语言…

作者头像 李华