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 regenera开发者_运维知识库ted.
// </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());
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;
}
}
}
}
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);
精彩评论