Удаление элементов в коде, сгенерированном из Codedom

Есть ли способ удалить элементы кода, сгенерированного в Codedom, из кода VB?

Например, вверху всего кода, который я генерирую, он имеет:

"------------------------------------------------- -----------------------------
' 
"Этот код был сгенерирован инструментом.
Runtime версия:4.0.30319.1
'
"Изменения в этом файле могут вызвать некорректное поведение и будут потеряны, если
'код обновлен.
' 
"------------------------------------------------- -----------------------------
Вариант Строгий Выкл 
Опция Явный Вкл 

Я хотел бы, чтобы оба из них ушли - закомментированный текст и оба Option xxx, Я пытался играть с CodeGeneratorOptions, но не удалось удалить вышеуказанное из сгенерированного кода.

4 ответа

Решение

Нет, это не может быть удалено. Он жестко запрограммирован в VBCompiler. Вы можете увидеть это в system.dll в Reflector.

Для #2, вы пробовали это?

CodeCompileUnit.UserData.Add("AllowLateBound", False) ' strict on
CodeCompileUnit.UserData.Add("RequireVariableDeclaration", False) ' explicit off

(где CodeCompileUnit является переменной типа CodeCompileUnit)

Вы можете использовать StringWriter для вывода вашего кода, затем использовать StringBuilder.Remove для удаления первых строк:

using (var stringWriter = new StringWriter())
using (var streamWriter = new StreamWriter(path))
{
    codeDomProvider.GenerateCodeFromCompileUnit(unit, stringWriter, options);
    StringBuilder sb = stringWriter.GetStringBuilder();
    /* Remove the header comment (444 is for C#, use 435 for VB) */
    sb.Remove(0, 444);
    streamWriter.Write(sb);
}

Это некрасиво, но это работает ™

Вот мое предложение, вдохновленное предложением Maxence, но, возможно, немного "чище", так как я использую регулярное выражение вместо индексов, которые могут меняться со временем. Это должно работать как для C#, так и для VB.net.

      using (var stringWriter = new StringWriter())
using (var sourceWriter = new StreamWriter(fileName, false, Encoding.UTF8))
{
   codeDomProvider.GenerateCodeFromCompileUnit(CodeUnit, stringWriter, generatorOptions);
   var newContent = Regex.Replace(stringWriter.ToString(), @"^//.*Runtime Version:.*$", "//\r", RegexOptions.Multiline);
   sourceWriter.Write(newContent);
}
Другие вопросы по тегам