2010-06-13 12 views
6

Sto utilizzando la classe CSharpCodeProvider per compilare uno script C# che utilizzo come DSL nella mia applicazione. Quando ci sono avvertenze ma nessun errore, la proprietà Errors dell'istanza CompilerResults risultante non contiene elementi. Ma quando introduco un errore, gli avvisi vengono improvvisamente elencati nella proprietà Errors.CSharpCodeProvider non restituisce gli avvisi del compilatore quando non ci sono errori

string script = @" 
    using System; 
    using System; // generate a warning 
    namespace MyNamespace 
    { 
     public class MyClass 
     { 
      public void MyMethod() 
      { 
       // uncomment the next statement to generate an error 
       //intx = 0; 
      } 
     } 
    } 
"; 

CSharpCodeProvider provider = new CSharpCodeProvider(
    new Dictionary<string, string>() 
    { 
     { "CompilerVersion", "v4.0" } 
    }); 

CompilerParameters compilerParameters = new CompilerParameters(); 
compilerParameters.GenerateExecutable = false; 
compilerParameters.GenerateInMemory = true; 

CompilerResults results = provider.CompileAssemblyFromSource(
    compilerParameters, 
    script); 

foreach (CompilerError error in results.Errors) 
{ 
    Console.Write(error.IsWarning ? "Warning: " : "Error: "); 
    Console.WriteLine(error.ErrorText); 
} 

Quindi, come ottenere gli avvisi quando non ci sono errori? A proposito, non voglio impostare TreatWarningsAsErrors su true.

+0

btw, vedere http://stackoverflow.com/questions/2610886/is-it-possibile-al-call-c-lexical-syntactic-analyzers-without-compilation/2611177#2611177 su 'GenerateInMemory' – abatishchev

+0

@abatishchev grazie, questo è un fatto interessante –

risposta

1

Non hai impostato CompilerParameters.WarningLevel

+0

L'ho già provato ma non ha fatto alcuna differenza. Inoltre, gli avvertimenti vengono segnalati se c'è almeno un errore. Ciò non accadrebbe se il livello di avviso fosse impostato su un livello inappropriato. –

+0

Quindi dopo tutto hai avuto ragione, ho dovuto impostare il livello di avviso su 3 (credo di aver provato solo 0, 1 e forse 2). Perché sei stato il primo a suggerirlo, ho accettato la tua risposta. –

+0

@Sandor: Grazie! Per quanto ho potuto capire da Reflector, 'WarningLevel' è impostato di default su' 4'. Ma in MSDN non si dice nulla, – abatishchev

1

ha funzionato bene per me, dopo ho fissato l'altro errori di compilazione nel codice (i caratteri di commento) e impostare compilerParameters.WarningLevel.

+0

Grazie, impostarlo su 3 in questo caso sembra fare il trucco. Penso sia strano, tuttavia, che in caso di uno o più errori gli avvisi vengano visualizzati indipendentemente dal valore del parametro del livello di avviso. –

Problemi correlati