2010-02-18 4 views
11

J'utilise CodeCompileUnit et CSharpCodeProvider pour générer du code source. Il ajoute l'en-tête ci-dessous à tout le code généré. Y a-t-il un moyen de personnaliser le commentaire pour qu'il en dise autre chose?Comment personnaliser le commentaire généré automatiquement lors de l'utilisation de la génération de code .NET CodeDom?

// <auto-generated> 
//  This code was generated by a tool. 
//  Runtime Version:2.0.50727.3053 
// 
//  Changes to this file may cause incorrect behavior and will be lost if 
//  the code is regenerated. 
// </auto-generated> 

Répondre

0

Bien que cela ne semble pas être directement pris en charge par CodeDOM, vous pouvez utiliser le fait que ce commentaire est explicitement délimité par les balises <auto-generated> et </auto-generated>. Ainsi, vous pouvez modifier ce commentaire tout simplement en effectuant des opérations de chaîne sur la sortie de CodeDOM:

var provider = new CSharpCodeProvider(); 
string generatedCode; 
using (var output = new StringWriter()) 
{ 
    provider.GenerateCodeFrom…(…, output, …); 
    generatedCode = output.ToString(); 
} 
string modifiedCode = Regex.Replace(generatedCode, …); // modify the output as you see fit 
3

Vous pouvez simplement ajouter vos commentaires au début du fichier à ressembler à ceci:

//---------------------------------------------------------------------------- 
// My comments 
// Are go here 
//---------------------------------------------------------------------------- 
// <auto-generated> 
//  This code was generated by a tool. 
//  Runtime Version:2.0.50727.3053 
// 
//  Changes to this file may cause incorrect behavior and will be lost if 
//  the code is regenerated. 
// </auto-generated> 
//---------------------------------------------------------------------------- 

Juste avant de générer le CompileUnit à un TextWriter faire:

CSharpCodeProvider provider = new CSharpCodeProvider(); 
var tw = new IndentedTextWriter(new StreamWriter(filename, false), " "); 

tw.WriteLine("//----------------------------------------------------------------------------"); 
tw.WriteLine("// My comments"); 
tw.WriteLine("// Are go here"); 

provider.GenerateCodeFromCompileUnit(compileUnit, tw, new CodeGeneratorOptions()); 
1

Puisque vous ne pouvez pas le faire via les API fournies dans CodeDom, voici un code je viens d'écrire pour résoudre le problème pour moi-même. Pas parfait, mais fait l'affaire.

var marker = "//------------------------------------------------------------------------------"; 
var allTheCode = sw.ToString(); 
var justTheRealCode = allTheCode.Substring(allTheCode.IndexOf(marker) + marker.Length, allTheCode.LastIndexOf(marker) + marker.Length); 
justTheRealCode = allTheCode.Substring(justTheRealCode.Length); 
1

Jolie kludgy, mais quand je devais le faire, je créé une classe qui enveloppe le flux de sortie et côtelettes hors les dix premières lignes:

/// <summary> 
    /// Removes the first 10 lines from the output. This removes the junk from the .NET Code Generator. 
    /// </summary> 
    internal class CodeOutputHelper : TextWriter 
    { 
     private readonly TextWriter _Inner; 
     private int _CountDown = 10; 

     public CodeOutputHelper(TextWriter inner) 
     { 
      _Inner = inner; 
     } 

     public override void WriteLine(string s) 
     { 
      if(_CountDown-- <= 0) 
      { 
       _Inner.WriteLine(s); 
      } 
     } 

     public override void Write(string value) 
     { 
      if (_CountDown<=0) 
      _Inner.Write(value); 
     } 

     public override void Write(char value) 
     { 
      _Inner.Write(value); 
     } 

     public override Encoding Encoding 
     { 
      get 
      { 
       return _Inner.Encoding; 
      } 
     } 
    } 
}