我有以下代码行:
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 \ Username \ AppData \ Local \ Temp \ _dgl5fb1i.err',因为它正由另一个进程使用。
但是,这是耗费超过8GB RAM的大型程序的一部分。在具有16GB RAM的系统上,不会抛出此异常。动态编译的代码编译好并运行。程序在具有足够RAM的系统上运行时没有任何错误。该程序是为x64编译的。请注意,我没有得到OutOfMemoryException
或任何迹象表明程序内存不足。在任务管理器中,在抛出IOException
之前,内存使用率几乎达到顶部。
什么可能导致这种行为,任何人都可以提出解决方案?
编辑
我修改了应用程序以使用更少的内存。即使应用程序有足够的可用内存,错误仍然存在。问题仍然只发生在一台机器上。
这可能与以下帖子有关:Prevent CompileAssemblyFromSource from generate temp files with duplicate file name。
我并行运行了几个编译。必须更改每个编译的临时目录,以便不会发生冲突。
CSharpCodeProvider prov = new CSharpCodeProvider();
CompilerParameters parms = new CompilerParameters();
parms.TempFiles = new TempFileCollection(tempdir);