2011-10-30 46 views

回答

21

看到这篇文章:

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

下面是他们提供的示例代码:

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

由于Aliostad在他的回答提到,谨慎使用该解决方案,但。您需要确保编译后的代码以自己的AppDomain结尾,否则会遇到内存泄漏。

参见如何加载代码此相关的问题到一个单独的AppDomain

How can I prevent CompileAssemblyFromSource from leaking memory?

+0

我不认为这可能是如此简单...哇! +1为你的答案 – Marco

+1

顺便说一句,这个代码示例只是最小编辑。我个人会在该错误消息循环中使用'StringBuilder',并覆盖文本框的文本而不是附加到它。 –

17

herehere

只要小心,任何编译和加载的代码都不能被卸载。这可能导致内存泄漏,即如果有人继续打字并更改代码并编译它,程序集会加载,最终会导致内存不足。

一个解决方案是创建一个秒AppDomain并在那里加载程序集,当不需要时卸载AppDomain。

+3

您没有看到我的评论吗? – Aliostad

+6

第二个AppDomain的+1 –