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 быть брошенным

Дополнительная информация: Процесс не может получить доступ к файлу 'C:\Users\ Имя пользователя \AppData\Local\Temp\dgl5fb1i.err', поскольку он используется другим процессом.

Однако это часть большой программы, которая потребляет более 8 ГБ ОЗУ. В системе с 16 ГБ ОЗУ это исключение не выдается. Код, который динамически компилируется, хорошо компилируется и запускается. Программа работает без ошибок в системе с достаточным объемом оперативной памяти. Программа скомпилирована для x64. Обратите внимание, что я не получаю OutOfMemoryException или любой признак того, что программе не хватает памяти. В диспетчере задач использование памяти почти достигает вершины, прежде чем IOException брошен

Что может быть причиной такого поведения, и может ли кто-нибудь предложить решение?

РЕДАКТИРОВАТЬ

Я изменил приложение, чтобы использовать существенно меньше памяти. Ошибка сохраняется, даже если приложение имеет достаточно доступной памяти. Проблема по-прежнему возникает только на одной машине.

Это может быть связано со следующим постом: Запретить CompileAssemblyFromSource создавать временные файлы с повторяющимся именем файла.

1 ответ

Решение

Я запускал несколько компиляций параллельно. Необходимо было изменить временный каталог для каждой компиляции, чтобы не возникали конфликты.

CSharpCodeProvider prov = new CSharpCodeProvider();
CompilerParameters parms = new CompilerParameters();
parms.TempFiles = new TempFileCollection(tempdir);
Другие вопросы по тегам