2011-10-30 21 views

risposta

21

si veda questo articolo:

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

Ecco il codice di esempio che forniscono:

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

Come Aliostad ha menzionato nella sua risposta, state attenti con questa soluzione, però. Dovrai assicurarti che il codice compilato finisca nel proprio codice AppDomain, altrimenti si verificheranno perdite di memoria.

Vai a questa domanda relativa su come caricare il codice in un separato AppDomain:

How can I prevent CompileAssemblyFromSource from leaking memory?

+0

Non pensavo che potesse essere così facile ... wow !!! +1 per la risposta – Marco

+1

BTW questo esempio di codice viene modificato solo in minima parte. Personalmente userò un 'StringBuilder' su quel ciclo di messaggi di errore, sovrascrivendo il testo della casella di testo piuttosto che aggiungendolo ad esso. –

17

Vedi here e here.

Basta fare attenzione, qualsiasi codice che viene compilato e caricato, non può essere scaricato. Ciò può causare la perdita di memoria , ad esempio se qualcuno continua a digitare e modificare il codice e lo compila, gli assembly vengono caricati e alla fine si esaurirà la memoria.

Una soluzione è quella di creare un secondo AppDomain e caricare l'assembly e quando non è necessario, scaricare AppDomain.

+3

Non hai visto i miei commenti? – Aliostad

+6

+1 per il secondo AppDomain –

Problemi correlati