Подтвердить что ты не робот

Как настроить автогенерированный комментарий при использовании .NET CodeDom Code Generation?

Я использую CodeCompileUnit и CSharpCodeProvider для генерации некоторого исходного кода. Он добавляет заголовок ниже ко всем сгенерированным кодом. Есть ли способ настроить комментарий, чтобы он говорил что-то еще?

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

Ответ 2

Вы можете просто добавить свои комментарии в начале файла, чтобы выглядеть так:

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

Перед созданием CompileUnit в TextWriter выполните:

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

Ответ 3

Так как вы не можете сделать это через предоставленные API в CodeDom, вот какой-то код, который я только что написал, чтобы решить эту проблему для себя. Не идеально, но делает трюк.

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

Ответ 4

Довольно kludgy, но когда мне нужно было это сделать, я создал класс, который обертывает выходной поток и отбивает первые десять строк:

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

Ответ 5

Хотя это, похоже, не поддерживается напрямую CodeDOM, вы можете использовать тот факт, что этот комментарий явно ограничен тегами <auto-generated> и </auto-generated>. Таким образом, вы можете изменить этот комментарий, просто выполнив строковые операции с выходом 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