Удаление элементов в коде, сгенерированном из 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);
}