动态编译代码时出现IOException

问题描述 投票:6回答:1

我有以下代码行:

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

c# memory-management reflection .net-assembly ioexception
1个回答
4
投票

我并行运行了几个编译。必须更改每个编译的临时目录,以便不会发生冲突。

CSharpCodeProvider prov = new CSharpCodeProvider();
CompilerParameters parms = new CompilerParameters();
parms.TempFiles = new TempFileCollection(tempdir);
© www.soinside.com 2019 - 2024. All rights reserved.