2016-05-05 19 views
6

Tôi có dòng mã sau đây:IOException khi động biên dịch mã

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

mà kết quả trong một IOException bị ném.

Thông tin thêm: Quá trình này không thể truy cập các tập tin 'C: \ Users \ Username \ AppData \ Local \ Temp \ dgl5fb1i.err' vì nó là được sử dụng bởi quá trình khác.

Tuy nhiên, đây là một phần của chương trình lớn tiêu thụ hơn 8GB RAM. Trên một hệ thống có RAM 16GB, ngoại lệ này không được ném. Mã được biên dịch động và hoạt động tốt. Chương trình chạy mà không có bất kỳ lỗi nào trên một hệ thống có đủ RAM. Chương trình được biên dịch cho x64. Lưu ý rằng tôi không nhận được OutOfMemoryException hoặc bất kỳ dấu hiệu nào cho thấy chương trình hết bộ nhớ. Trong Trình quản lý Tác vụ, việc sử dụng bộ nhớ gần như đạt đến đỉnh trước khi số IOException bị ném.

Điều gì có thể gây ra hành vi này và bất kỳ ai cũng có thể đề xuất giải pháp?

EDIT

tôi sửa đổi các ứng dụng để sử dụng ít bộ nhớ đáng kể. Lỗi vẫn tồn tại mặc dù ứng dụng có đủ bộ nhớ khả dụng. Vấn đề vẫn chỉ xảy ra trên một máy.

Điều này có thể liên quan đến bài đăng sau: Prevent CompileAssemblyFromSource from generate temp files with duplicate file name.

Trả lời

4

Tôi đã chạy một vài trình biên dịch song song. Nó là cần thiết để thay đổi thư mục tạm thời cho mỗi biên dịch, do đó xung đột không xảy ra.

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

cùng một vấn đề. vì vậy tôi đoán tôi sẽ cần giải pháp tương tự ... cảm ơn! –

Các vấn đề liên quan