Roslyn(CSharpScript).Net脚本编译引擎使用过程内存增涨与稳定的方式
2021/9/24 7:14:19
本文主要是介绍Roslyn(CSharpScript).Net脚本编译引擎使用过程内存增涨与稳定的方式,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
目 录
1. 引用程序集... 1
2. 内存增涨的情况... 2
3. 内存稳定的情况... 4
1. 引用程序集
Roslyn 是微软公司开源的 .NET 编译器。编译器支持 C# 和 Visual Basic 代码编译,并提供丰富的代码分析 API。使用非常方便,增加引用脚本编译引擎程序集:Microsoft.CodeAnalysis.CSharp.Scripting.dll,如下图:
但是在使用过程中会出现内存增涨的情况,如果要解决这个问题,需要对代码进行结构化处理。下面演示内存增涨和稳定两种情况。
2. 内存增涨的情况
直接使用内部的API接口:CSharpScript.EvaluateAsync,完整代码如下:
using Microsoft.CodeAnalysis.CSharp.Scripting; using Microsoft.CodeAnalysis.Scripting; namespace ConsoleApp1 { public class Program { private static ScriptOptions scriptOptions=ScriptOptions.Default.WithEmitDebugInformation(false); private static string script="int num=1+2;Write(num);return num;"; private static Custom custom = new Custom(); static void Main(string[] args) { while(true) { MemoryRise(); Thread.Sleep(10); } } //内存内涨 public static void MemoryRise() { object result = CSharpScript.EvaluateAsync(script,scriptOptions,custom,typeof(Custom)).Result; if(result!=null) { Console.WriteLine(DateTime.Now.ToString ()+" Result:"+result.ToString ()); } } } public class Custom { public void Write(int num) { Console.WriteLine("Custome.Write:"+num.ToString()); } } }
在调试代码的过程,每次执行代码会把代码生成一个新的程序集模块,并且在新的程序域中加载,没有找到卸载程序域和模块的方法。如下图:
正式运行编译好的程序集,内存明显增涨的比较快。如下图:
3. 内存稳定的情况
要避免对相同代码进行反复编译和加载模块,需要对代码进行特殊处理。代码如下:
using Microsoft.CodeAnalysis.CSharp.Scripting; using Microsoft.CodeAnalysis.Scripting; namespace ConsoleApp1 { public class Program { private static ScriptOptions scriptOptions=ScriptOptions.Default.WithEmitDebugInformation(false); private static Script baseScript = CSharpScript.Create("", options: scriptOptions, globalsType: typeof(Custom)); private static Dictionary<string, Script<object>> loadScriptCache = new Dictionary<string, Script<object>> (); private static string script="int num=1+2;Write(num);return num;"; private static Custom custom = new Custom(); static void Main(string[] args) { while(true) { MemoryNormal(); Thread.Sleep(10); } } //内存稳定 public static void MemoryNormal() { if (!loadScriptCache.ContainsKey(script)) loadScriptCache.Add(script, baseScript.ContinueWith<object>(script)); ScriptState<object> scriptState = loadScriptCache[script].RunAsync(custom).Result; if(scriptState.ReturnValue!=null) { Console.WriteLine(DateTime.Now.ToString ()+" Result:"+scriptState.ReturnValue.ToString ()); } } } public class Custom { public void Write(int num) { Console.WriteLine("Custome.Write:"+num.ToString()); } } }
只会编译和加载一次相同代码的程序集模块,编译调试过程如下图:
正式运行编译好的程序集,运行一段时间,内存稳定在80多MB。如下图:
物联网&大数据技术 QQ群:54256083
物联网&大数据项目 QQ群:727664080
网站:http://www.ineuos.net
QQ:504547114
微信:wxzz0151
博客:https://www.cnblogs.com/lsjwq
微信公众号:iNeuOS
这篇关于Roslyn(CSharpScript).Net脚本编译引擎使用过程内存增涨与稳定的方式的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2022-03-01沐雪多租宝商城源码从.NetCore3.1升级到.Net6的步骤
- 2024-11-18微软研究:RAG系统的四个层次提升理解与回答能力
- 2024-11-15C#中怎么从PEM格式的证书中提取公钥?-icode9专业技术文章分享
- 2024-11-14云架构设计——如何用diagrams.net绘制专业的AWS架构图?
- 2024-05-08首个适配Visual Studio平台的国产智能编程助手CodeGeeX正式上线!C#程序员必备效率神器!
- 2024-03-30C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】
- 2024-03-29c# datetime tryparse
- 2024-02-21list find index c#
- 2024-01-24convert toint32 c#
- 2024-01-24Advanced .Net Debugging 1:你必须知道的调试工具