2010-06-13 3 views
6

J'utilise la classe CSharpCodeProvider pour compiler un script C# que j'utilise comme DSL dans mon application. Lorsqu'il y a des avertissements mais pas d'erreurs, la propriété Errors de l'instance CompilerResults résultante ne contient aucun élément. Mais quand j'introduis une erreur, les avertissements apparaissent soudainement dans la propriété Errors.CSharpCodeProvider ne retourne pas les avertissements du compilateur lorsqu'il n'y a pas d'erreurs

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

Alors, comment obtenir les avertissements en l'absence d'erreurs? Par ailleurs, je ne veux pas mettre TreatWarningsAsErrors à true.

+0

btw, voir http://stackoverflow.com/questions/2610886/is-it-possible-pour-call-c-lexical-syntactic-analyzers-without-compilation/2611177#2611177 about 'GenerateInMemory' – abatishchev

+0

@abatishchev merci, c'est un fait intéressant. –

Répondre

1

Vous n'avez pas défini CompilerParameters.WarningLevel

+0

J'ai déjà essayé, mais ça n'a pas fait de différence. De plus, les avertissements sont signalés s'il y a au moins une erreur. Cela ne se produirait pas si le niveau d'avertissement était réglé à un niveau inapproprié. –

+0

Donc, il se trouve que vous aviez raison après tout, je devais régler le niveau d'avertissement à 3 (je suppose que j'ai seulement essayé 0, 1 et peut-être 2). Parce que vous étiez le premier à le suggérer, j'ai accepté votre réponse. –

+0

@Sandor: Merci! Pour autant que je puisse comprendre à partir du réflecteur 'WarningLevel' est réglé par défaut à' 4'. Mais dans MSDN rien n'est dit à ce sujet, – abatishchev

1

Il a bien fonctionné pour moi, après avoir fixé l'autre compilation des erreurs dans votre code (Les caractères de commentaire) et mis compilerParameters.WarningLevel.

+0

Merci, le réglage à 3 dans ce cas semble faire l'affaire. Je pense qu'il est curieux cependant que dans le cas d'une ou plusieurs erreurs, les avertissements apparaissent indépendamment de la valeur du paramètre de niveau d'avertissement. –

Questions connexes