2011-10-30 22 views

Respuesta

21

Ver este artículo:

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

Aquí está el código de ejemplo que proporcionan:

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

Como Aliostad ha mencionado en su respuesta, tenga cuidado con esta solución, sin embargo. Deberá asegurarse de que su código compilado termine en su propio AppDomain, de lo contrario, experimentará pérdidas de memoria.

Ver esta pregunta relacionada sobre cómo cargar el código en un separada AppDomain:

How can I prevent CompileAssemblyFromSource from leaking memory?

+0

No pensé que podría ser tan fácil ... ¡guau! +1 para su respuesta – Marco

+1

Por cierto, este ejemplo de código solo se edita mínimamente. Yo personalmente usaría un 'StringBuilder' en ese bucle de mensaje de error, y sobrescribiría el texto del cuadro de texto en lugar de anexarlo. –

17

Ver here y here.

Sólo tenga cuidado, cualquier código compilado y cargado no se puede descargar. Esto puede causar pérdida de memoria, es decir, si alguien sigue escribiendo y cambiando el código y compilándolo, los ensamblajes se cargan y finalmente se quedará sin memoria.

Una solución es crear un segundo AppDomain y cargar el ensamblado ahí y, cuando no sea necesario, descargar el AppDomain.

+3

¿No has visto mis comentarios? – Aliostad

+6

+1 para segundo AppDomain –

Cuestiones relacionadas