2016-05-05 93 views
6

我有下面的代碼行:IOException異常時動態編譯代碼

CSharpCodeProvider c = new CSharpCodeProvider(); 
CompilerParameters cp = new CompilerParameters(); 
cp.ReferencedAssemblies.Add("system.dll"); 
cp.CompilerOptions = "/t:library"; 
cp.GenerateInMemory = true; 
CompilerResults cr = c.CompileAssemblyFromSource(cp, sb.ToString()); 

這導致了IOException被拋出。

附加信息:過程不能訪問該文件 'C:\ Users \用戶名\應用程序數據\本地\ TEMP \ dgl5fb1i.err',因爲它是被另一個過程 。

但是,這是大型程序的一部分,它消耗了超過8GB的RAM。在具有16GB RAM的系統上,不會拋出此異常。動態編譯的代碼很好地編譯並運行。該程序在有足夠RAM的系統上運行時沒有任何錯誤。該程序是爲x64編譯的。請注意,我沒有收到OutOfMemoryException或任何有關該程序內存不足的跡象。在任務管理器中,在拋出IOException之前,內存使用率幾乎達到頂部。

什麼可能導致這種行爲,任何人都可以提出解決方案?

EDIT

我修改應用程序使用基本上更少的內存。即使應用程序具有足夠的可用內存,錯誤仍然存​​在。該問題仍然只發生在一臺機器上。

這可能與以下帖子有關:Prevent CompileAssemblyFromSource from generate temp files with duplicate file name

回答

4

我正在並行運行幾個編譯。有必要更改每個編譯的臨時目錄,以避免發生衝突。

CSharpCodeProvider prov = new CSharpCodeProvider(); 
CompilerParameters parms = new CompilerParameters(); 
parms.TempFiles = new TempFileCollection(tempdir); 
+0

同樣的問題。所以我想我會需要相同的解決方案......謝謝! –