2013-11-25 73 views
1

有沒有在後續應用程序運行之間持久保留CS腳本內部程序集緩存的方法?加載腳本時CS腳本持久緩存更好的性能

使用的成分:http://www.csscript.net/

的期望的行爲是: 當我編譯的組件形成一個腳本串和我關閉應用程序,下一次我運行匹配腳本串編譯組件被發現的應用和不需要重新編譯。

這個問題的另一個問題後續: Is there a way to call C# script files with better performance results?

這裏是我的代碼,但每一個腳本字符串需要與母公司.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創建臨時腳本的文件夾:\用戶\ vdohnal \應用程序數據\本地的\ Temp \ CSSCRIPT \緩存\ 2015108000擁有41 MB,並用文件越來越多幾個月大。

在WPF應用程序的輸出窗口有第一機會異常: 型「System.IO.FileLoadException」的第一次機會異常出現在mscorlib.dll 型「System.IO.FileLoadException」的第一次機會異常發生在mscorlib.dll mscorlib.dll中發生類型'System.IO.FileLoadException'的第一次機會異常 mscorlib.dll中發生第一次機會異常'System.IO.FileLoadException' 類型的第一次機會異常'System.IO.FileLoadException'發生在mscorlib.dll 'ESClient.vshost.exe'(Managed(v4.0.30319)):Loaded'C:\ Users \ vdohnal \ AppData \ Local \ Temp \ CSSCRIPT \ Cache \ 2015108000 \ af621e10-d711-40d7-9b77-0a8e7de28831.tmp.compiled' C:\用戶\ vdohnal \應用程序數據\本地的\ Temp \ CSSCRIPT \緩存\ 2015108000

回答

2

我得到的回答FOM奧列格·希洛其中我指出了正確的方向:

緩存文件夾確實成長,如新的腳本被編譯/加載。這是 是緩存的本質。它似乎「不加控制地增長」 雖然它不是。一旦爲給定的腳本文件創建了緩存,它就不會重複,並且新的緩存更新總是通過現有的 寫入。

你的情況的問題是,每次你加載文件,你給它一個獨特的名字,因此你正在創建一個新的獨特的緩存。要修復它 您需要開始使用相同的名稱爲腳本文件,每次您加載/執行它 。

或者,您可以完全接管緩存位置,並指定您想要的緩存名稱。這是第二個參數 你傳遞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) 

初始加載的速度較好,不存在失控增長緩存。