C# CS脚本持久缓存可在加载脚本时获得更好的性能

C# CS脚本持久缓存可在加载脚本时获得更好的性能,c#,caching,scripting,persistence,C#,Caching,Scripting,Persistence,有没有办法在后续应用程序运行之间持久化CS脚本内部程序集缓存 使用的组件: 期望的行为是: 当我从脚本字符串编译程序集并关闭应用程序时,下一次运行应用程序时,将找到具有匹配脚本字符串的已编译程序集,无需重新编译 这个问题是另一个问题的后续问题: 这是我的代码,但每次重新启动父.NET应用程序时,每个脚本字符串都需要重新编译 public interface ICalculateScript { Exception Calculate(QSift qsift, QSExamParams

有没有办法在后续应用程序运行之间持久化CS脚本内部程序集缓存

使用的组件:

期望的行为是: 当我从脚本字符串编译程序集并关闭应用程序时,下一次运行应用程序时,将找到具有匹配脚本字符串的已编译程序集,无需重新编译

这个问题是另一个问题的后续问题:

这是我的代码,但每次重新启动父.NET应用程序时,每个脚本字符串都需要重新编译

public interface ICalculateScript
{
    Exception Calculate(QSift qsift, QSExamParams exam);
}

...
void Calculate(string script)
{
    CSScript.CacheEnabled = true; 
    //Can following command use built-in cache to load assembly, compiled by this line of code, but by another instance of this app which run in the past and has been meanwhile closed? 
    Assembly assembly = = CSScript.LoadCode(script, null);

    AsmHelper asmHelper = new AsmHelper(assembly);
    ICalculateScript calcScript = (ICalculateScript)asmHelper.CreateObject("Script");
    calcScript.Calculate(this, exam);
}
相关问题: CS脚本C:\Users\vdohnal\AppData\Local\temp\CSSCRIPT\Cache\2015108000中缓存创建的临时脚本文件夹有41 MB,并且随着几个月前的文件不断增长

在WPF应用程序的输出窗口中,存在第一次机会异常: mscorlib.dll中发生类型为“System.IO.FileLoadException”的第一次意外异常 mscorlib.dll中发生类型为“System.IO.FileLoadException”的第一次意外异常 mscorlib.dll中发生类型为“System.IO.FileLoadException”的第一次意外异常 mscorlib.dll中发生类型为“System.IO.FileLoadException”的第一次意外异常 mscorlib.dll中发生类型为“System.IO.FileLoadException”的第一次意外异常 'ESClient.vshost.exe'(托管(v4.0.30319)):加载'C:\Users\vdohnal\AppData\Local\Temp\CSSCRIPT\Cache\2015108000\af621e10-d711-40d7-9b77-0a8e7de28831.tmp.compiled'
C:\Users\vdohnal\AppData\Local\Temp\CSSCRIPT\Cache\2015108000

我从Oleg Shilo那里得到了一个正确的答案:

当编译/加载新脚本时,缓存文件夹确实会增长。这 是缓存的本质。它似乎“不受控制地成长” 虽然不是。一旦为给定的脚本文件创建了缓存,它就会 从不重复,并且新缓存更新始终写入 现有的一个

您的问题是,每次加载您提供的文件时 它是一个唯一的名称,因此您正在创建一个新的唯一缓存。修理它 每次都需要为脚本文件使用相同的名称 您可以加载/执行它

或者,您可以完全接管缓存位置并 指定所需的缓存名称。这是第二个参数 为以下项传递null:

 Assembly assembly = CSScript.LoadCode(script, null);
我使用了以下代码:

if (assemblyFileName == null)
    assembly = CSScript.LoadCode(script, null); //In case there is no name specified - when my custom temp folder cannot be created etc.
else
    assembly = CSScript.LoadCode(script, assemblyFileName, false, null);  //Specify full path and file name with extension 
由于这一点,我可以完全控制缓存的程序集名称和位置。 如果已存在带有适当脚本的缓存程序集,我可以简单地加载它,而不是编译新的程序集:

Assembly assembly = Assembly.LoadFrom(assemblyFileName);
AsmHelper asmHelper = new AsmHelper(assembly)
初始加载速度更快,并且没有无法控制的缓存增长