6

Ich habe die folgende Codezeile:IOException beim dynamischen Kompilieren von 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()); 

, die in einem IOException führt geworfen.

Zusätzliche Informationen: Der Prozess kann nicht auf die Datei zugreifen 'C: \ Users \ Benutzername \ AppData \ Local \ Temp \ dgl5fb1i.err', weil es ist von einem anderen Prozess verwendet wird.

Dies ist jedoch ein Teil eines großen Programms, das mehr als 8 GB RAM verbraucht. Auf einem System mit 16 GB RAM wird diese Ausnahme nicht ausgelöst. Der dynamisch kompilierte Code wird gut kompiliert und ausgeführt. Das Programm läuft fehlerfrei auf einem System mit ausreichendem RAM. Das Programm ist für x64 kompiliert. Beachten Sie, dass ich keine OutOfMemoryException oder irgendeinen Hinweis bekomme, dass das Programm nicht genügend Arbeitsspeicher hat. Im Task-Manager erreicht die Speicherauslastung fast die Spitze, bevor IOException ausgelöst wird.

Was könnte dieses Verhalten verursachen und kann jemand eine Lösung vorschlagen?

EDIT

modifizierte ich die Anwendung wesentlich weniger Speicher zu verwenden. Der Fehler bleibt bestehen, obwohl die Anwendung über genügend verfügbaren Arbeitsspeicher verfügt. Das Problem tritt immer noch nur auf einem Computer auf.

Dies könnte mit dem folgenden Beitrag zusammenhängen: Prevent CompileAssemblyFromSource from generate temp files with duplicate file name.

Antwort

4

Ich habe mehrere Compilation parallel ausgeführt. Es war notwendig, das temporäre Verzeichnis für jede Kompilierung zu ändern, so dass Konflikte nicht auftreten.

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

gleiches Problem. Ich denke, ich brauche die gleiche Lösung ... Danke! –