2016-05-05 42 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

同样的问题。所以我想我会需要相同的解决方案......谢谢! –