当前位置: 动力学知识库 > 问答 > 编程问答 >

c# - How do I customize the auto-generated comment when using .NET CodeDom Code Generation?

问题描述:

I'm using CodeCompileUnit and CSharpCodeProvider to generate some source code. It adds the header below to all generated code. Is there a way to customize the comment so it says something else?

// <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>

网友答案:

You can't. I recommend adding your own comment immediately after this one. Here's an example of how to do that: http://www.codeproject.com/KB/dotnet/ResourceClassGenerator.aspx

网友答案:

You can simply add your comments at the beginning of the file to look like this:

//----------------------------------------------------------------------------
// 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>
//----------------------------------------------------------------------------

Just before generating the CompileUnit to a TextWriter do:

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());
网友答案:

While this doesn't seem to be directly supported by CodeDOM, you can use the fact that this comment is explicitly delimited by the tags <auto-generated> and </auto-generated>. So you could alter this comment simply by performing string operations on CodeDOM's output:

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
网友答案:

Since you can't do it via the provided APIs in CodeDom, here's some code I just wrote to solve the issue for myself. Not perfect, but does the trick.

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);
网友答案:

Pretty kludgy, but when I needed to do this, I created a class that wraps the output stream and chops off the first ten lines:

    /// <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;
            }
        }
    }
}
分享给朋友:
您可能感兴趣的文章:
随机阅读: