动态编译代码时出现IOException
IOException when dynamically compiling code
我有下面一行代码:
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
被抛出。
Additional information: The process cannot access the file
'C:\Users\Username\AppData\Local\Temp\dgl5fb1i.err' because it is
being used by another process.
但是,这是消耗超过 8GB RAM 的大型程序的一部分。在具有 16GB RAM 的系统上,不会抛出此异常。动态编译的代码可以很好地编译并运行。该程序在具有足够 RAM 的系统上运行时没有任何错误。该程序是为 x64 编译的。请注意,我没有收到 OutOfMemoryException
或程序内存不足的任何指示。在任务管理器中,在抛出 IOException
之前,内存使用率几乎达到最高。
是什么导致了这种行为,有人可以提出解决方案吗?
编辑
我修改了应用程序以使用更少的内存。即使应用程序有足够的可用内存,错误仍然存在。问题仍然只出现在一台机器上。
这可能与以下内容有关 post:Prevent CompileAssemblyFromSource from generate temp files with duplicate file name。
我是运行几个并行编译的。每次编译都要更改临时目录,以免发生冲突。
CSharpCodeProvider prov = new CSharpCodeProvider();
CompilerParameters parms = new CompilerParameters();
parms.TempFiles = new TempFileCollection(tempdir);
我有下面一行代码:
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
被抛出。
Additional information: The process cannot access the file 'C:\Users\Username\AppData\Local\Temp\dgl5fb1i.err' because it is being used by another process.
但是,这是消耗超过 8GB RAM 的大型程序的一部分。在具有 16GB RAM 的系统上,不会抛出此异常。动态编译的代码可以很好地编译并运行。该程序在具有足够 RAM 的系统上运行时没有任何错误。该程序是为 x64 编译的。请注意,我没有收到 OutOfMemoryException
或程序内存不足的任何指示。在任务管理器中,在抛出 IOException
之前,内存使用率几乎达到最高。
是什么导致了这种行为,有人可以提出解决方案吗?
编辑
我修改了应用程序以使用更少的内存。即使应用程序有足够的可用内存,错误仍然存在。问题仍然只出现在一台机器上。
这可能与以下内容有关 post:Prevent CompileAssemblyFromSource from generate temp files with duplicate file name。
我是运行几个并行编译的。每次编译都要更改临时目录,以免发生冲突。
CSharpCodeProvider prov = new CSharpCodeProvider();
CompilerParameters parms = new CompilerParameters();
parms.TempFiles = new TempFileCollection(tempdir);