动态编译代码时出现IOException

时间:2016-05-05 10:56:14

标签: c# memory-management reflection .net-assembly ioexception

我有以下代码行:

resizableimagewithcapinsets

导致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()); 被抛出。

  

其他信息:进程无法访问该文件   ' C:\ Users \用户名\应用程序数据\本地\ TEMP \ dgl5fb1i.err'因为它是   被另一个进程使用。

然而,这是耗费超过8GB RAM的大型程序的一部分。在具有16GB RAM的系统上,不会抛出此异常。动态编译的代码编译好并运行。程序在具有足够RAM的系统上运行时没有任何错误。该程序是为x64编译的。请注意,我没有得到IOException或任何迹象表明程序内存不足。在任务管理器中,内存使用率几乎在抛出OutOfMemoryException之前达到顶部。

可能导致此行为的原因是什么,有人可以建议解决方案吗?

修改

我修改了应用程序以使用更少的内存。即使应用程序有足够的可用内存,错误仍然存​​在。问题仍然只发生在一台机器上。

这可能与以下帖子有关:Prevent CompileAssemblyFromSource from generate temp files with duplicate file name

1 个答案:

答案 0 :(得分:4)

我正在并行运行多个编译。有必要更改每个编译的临时目录,以便不会发生冲突。

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