2011-10-30 36 views

Trả lời

21

Xem bài viết này:

http://support.microsoft.com/kb/304655

Dưới đây là đoạn code mẫu mà họ cung cấp:

var codeProvider = new CSharpCodeProvider(); 
ICodeCompiler icc = codeProvider.CreateCompiler(); 

var parameters = new CompilerParameters() 
{ 
    GenerateExecutable = true, 
    OutputAssembly = Output, 
}; 
CompilerResults results = icc.CompileAssemblyFromSource(parameters, sourceString); 

if (results.Errors.Count > 0) 
{ 
    foreach(CompilerError error in results.Errors) 
    { 
     textBox2.Text = textBox2.Text 
      + "Line number " + error.Line 
      + ", Error Number: " + error.ErrorNumber 
      + ", '" + error.ErrorText + ";" 
      + Environment.NewLine + Environment.NewLine 
      ; 
    } 
} 

Như Aliostad đã đề cập trong câu trả lời của mình, hãy cẩn thận với giải pháp này, mặc dù. Bạn sẽ cần đảm bảo mã được biên dịch của bạn kết thúc bằng số AppDomain riêng của mình, nếu không bạn sẽ bị rò rỉ bộ nhớ.

Xem câu hỏi liên quan này về cách nạp mã vào một riêng biệt AppDomain:

How can I prevent CompileAssemblyFromSource from leaking memory?

+0

Tôi không nghĩ rằng nó có thể dễ dàng như vậy ... wow !!! 1 cho câu trả lời của bạn – Marco

+1

BTW mẫu mã này chỉ được chỉnh sửa tối thiểu. Tôi cá nhân sử dụng một 'StringBuilder' trên vòng lặp thông báo lỗi đó và ghi đè lên văn bản của hộp văn bản thay vì gắn thêm vào nó. –

17

Xem herehere.

Chỉ cần cẩn thận, mọi mã được biên dịch và tải, không thể tải xuống. Điều này có thể gây ra rò rỉ bộ nhớ , tức là nếu ai đó tiếp tục nhập và thay đổi mã và biên dịch nó, các hội đồng sẽ được tải và cuối cùng bạn sẽ hết bộ nhớ.

Một giải pháp là tạo thứ hai AppDomain và tải lắp ráp trong đó và khi không cần, hãy dỡ bỏ AppDomain.

+3

Bạn không thấy nhận xét của mình? – Aliostad

+6

+1 cho AppDomain thứ hai –

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