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);