2010-06-13 21 views
6

Estoy usando la clase CSharpCodeProvider para compilar un script C# que uso como DSL en mi aplicación. Cuando hay advertencias pero no hay errores, la propiedad Errors de la instancia resultante CompilerResults no contiene elementos. Pero cuando introduzco un error, las advertencias aparecen de repente en la propiedad Errors también.CSharpCodeProvider no devuelve las advertencias del compilador cuando no hay errores

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

Entonces, ¿cómo puedo obtener las advertencias cuando no hay ningún error? Por cierto, no quiero establecer TreatWarningsAsErrors en true.

+0

por cierto, ver http://stackoverflow.com/questions/2610886/is-it-possible-to-call-c-lexical-syntactic-analyzers-without-compilation/2611177#2611177 sobre 'GenerateInMemory' – abatishchev

+0

@abatishchev gracias, eso es un hecho interesante. –

Respuesta

1

no configuró CompilerParameters.WarningLevel

+0

Lo intenté pero no hizo ninguna diferencia. Además, las advertencias se informan si hay al menos un error. Eso no sucedería si el nivel de advertencia se configurara en un nivel inapropiado. –

+0

Entonces resultó que tenía razón después de todo, tuve que establecer el nivel de advertencia en 3 (supongo que solo intenté 0, 1 y tal vez 2). Como usted fue el primero en sugerir esto, acepté su respuesta. –

+0

@Sandor: ¡Gracias! Por lo que pude entender, Reflector 'WarningLevel' se está configurando por defecto a' 4'. Pero en MSDN no se dice nada al respecto, – abatishchev

1

funcionó bien para mí, después me fijo el otro errores de compilación en el código (los caracteres de comentario) y ajuste compilerParameters.WarningLevel.

+0

Gracias, establecerlo en 3 en este caso parece ser el truco. Creo que es peculiar, sin embargo, que en el caso de uno o más errores, las advertencias aparecen independientemente del valor del parámetro del nivel de advertencia. –

Cuestiones relacionadas