我有一個Windows服務,一直即使在大量併發工作多年運行沒有任何問題下面的代碼:CSharpCodeProvider,CompilerParameters.GenerateInMemory和CompilerResults.PathToAssembly:古怪的行爲
CSharpCodeProvider codeProvider = new CSharpCodeProvider();
CompilerParameters parameters = new CompilerParameters();
parameters.GenerateExecutable = false;
parameters.GenerateInMemory = true;
parameters.OutputAssembly = outputAssemblyFile;
CompilerResults results = codeProvider.CompileAssemblyFromFile(parameters, "file.cs");
if (results.Errors.Count > 0)
{
Console.WriteLine("Compile ERROR");
}
else
{
Console.WriteLine("Compile OK");
Console.WriteLine("Assembly Path:" + results.PathToAssembly);
Console.WriteLine("Assembly Name:" + results.CompiledAssembly.FullName);
}
通常,當代碼已成功編譯,因爲parameters.GenerateInMemory設置爲true,results.PathToAssembly爲空(如MSDN中指定的)
其中一個問題是,有時代碼已成功編譯,但result.PathToAssembly不是null。此外,CompiledAssembly正在返回一個FileNotFoundException,但是當我檢查由results.PathToAssembly指示的路徑時,程序集確實在那裏。然而,我不能確定它在那個特定時刻。
我重新啓動該服務,一切都回到正軌。
有什麼明顯的原因要做到這一點?
思考,這可能是一些權限問題我試圖在已經創建的組件,並設置文件只讀重現該問題,但引起編譯失敗的原因。
當結果=正在查找指定程序集的路徑時,偶然會發生輕微的權限問題。也可以在代碼中釋放或處理新創建的對象..如果在導致此特定錯誤時可能存在某些緩存問題,我會發現它。 – MethodMan 2012-01-04 19:24:47
爲什麼要設置'parameters.OutputAssembly'參數。 GenerateExecutable == false'? – 2012-01-04 20:16:53
@ M.Babcock我想你的意思是parameters.GenerateInMemory = true。這是個好問題。 OutputAssembly正在設置,因爲我們需要程序集(實際的文件)。我沒有編寫代碼,因此我不知道GenerateInMemory部分。 – 2012-01-04 22:59:23