c# - 动态编译代码时出现IOException

标签 c# memory-management reflection .net-assembly 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

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 之前,内存使用率几乎达到顶峰。

可能是什么导致了这种行为,任何人都可以提出解决方案吗?

编辑

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

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

最佳答案

我正在并行运行多个编译。每次编译都需要更改临时目录,以免发生冲突。

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

关于c# - 动态编译代码时出现IOException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37048788/

相关文章:

c# wcf - 在代理类上调用 open() 时抛出异常

scala - 使用 ScalaTest 时出现 java.lang.NoSuchFieldError

memory-management - Linux 内存管理

java - 通过反射获取Java中类的公共(public)静态最终字段/属性的值

c# - 重播功能和参数列表

c# - 对集合使用 CollectionAssert.Contains

c# - 为什么调用 WindsorContainer 的 AddComponent 时要使用 key 参数?

c# - 在 C# 中从文件加载公钥

c - 在C中分配多维数组

c# - 就内存而言,清除数组的更好方法是什么