Может ли CodeDom добавлять файлы исходного кода в проект?

Я использую CodeDom для генерации кода. Это прекрасно работает, но я не нашел способа включить сгенерированные файлы исходного кода в проект. Я начал использовать T4 и T4Toolbox для создания кода, поскольку он поддерживает интеграцию с файлами проекта.

Кто-нибудь знает, поддерживает ли CodeDom эту функцию? Я бы еще раз взглянул на CodeDom, если бы он поддерживал только одну эту функцию.

Вот пример того, как я создаю файл исходного кода с помощью CodeDom:

protected void CreateSourceFile(CodeCompileUnit codeCompileUnit,
                                string fileName,
                                out string fileNameWithExtension)
{
    fileNameWithExtension = string.Format("{0}.{1}",
                                          fileName,
                                          CodeProvider.FileExtension);

    var indentedTextWriter =
        new IndentedTextWriter(new StreamWriter(fileNameWithExtension,
                                                false),
                               TabString);

    CodeProvider.GenerateCodeFromCompileUnit(codeCompileUnit,
                                             indentedTextWriter,
                                             new CodeGeneratorOptions());

    indentedTextWriter.Close();
}

Это работает нормально, но он просто выводит файл куда-то на жесткий диск (возможно, в папку bin).

Вот второй пример кода, который я использую с T4, он определяет вывод как часть проекта, в который преобразуется шаблон:

public class RDFSClassGenerator : Generator
{
    private readonly string rootNamespace;
    private readonly string ontologyLocation;

    public RDFSClassGenerator(
        string rootNamespace,
        string ontologyLocation)
    {
        this.rootNamespace = rootNamespace;
        this.ontologyLocation = ontologyLocation;
    }

    protected override void RunCore()
    {

        XElement ontology = XElement.Load(ontologyLocation);
        var service = new RDFSGeneratorService(ontology);

        foreach (MetaClass metaClass in service.MetaClasses)
        {
            var rdfsClassTemplate = new RDFSClassTemplate(rootNamespace, metaClass);
            rdfsClassTemplate.Output.File = "Domain/" + metaClass.Name + ".cs";
            rdfsClassTemplate.Render();
        }

    }
}

Таким образом, код T4 выведет файл в папку «Домен» моего проекта. Но материал CodeGen просто выводит файл на диск и не обновляет файл проекта.

Вот визуальный ряд:

альтернативный текст


person Paul Fryer    schedule 28.07.2010    source источник
comment
Хм, не уверен, что ты делаешь. Вы смешиваете CodeDom с t4? Я использую T4 для добавления файлов в решение, делая шаблон специфичным для хоста, а затем используя EnvDTE, чтобы добавить файл в решение. Может быть, вам нужно уточнить, что вы делаете?   -  person    schedule 28.07.2010
comment
@Will Я только что добавил пару примеров выше о том, как я использую CodeDom и T4. Похоже, мне может понадобиться изучить EnvDTE?   -  person Paul Fryer    schedule 28.07.2010


Ответы (2)


Да, оно может. Вот как: http://www.olegsych.com/2009/09/t4-and-codedom-better-together/

person Oleg Sych    schedule 28.07.2010
comment
Спасибо за ссылку. Я рассмотрю это более подробно в ближайшее время. Полезно знать, что code dom и t4 можно использовать вместе. - person Paul Fryer; 02.08.2010

Краткий ответ - нет, но я могу ошибаться (когда-нибудь пытались доказать отрицательный ответ?)

Ваш вопрос был немного запутанным, поскольку CodeDom не совсем равноправен с T4. Шаблоны T4 — это удобный способ создания файлов кода таким же образом, например, asp.net создает файлы HTML, смешивая текст и код, который выполняется для создания файла, который затем интерпретируется чем-то другим (например, компилятором или браузером). ). CodeDom обычно используется для создания сборок во время выполнения, а не файлов, хотя вы можете это сделать (как вы обнаружили).

Хотя T4 упрощает добавление файлов в решение, вы можете сделать это и с CodeDom. Я не думаю, что он поддерживает взаимодействие с решением напрямую, но вы можете управлять этим с помощью EnvDTE или модели автоматизации для Visual Studio.

Проблема в том, что с моделью автоматизации работать непросто. EnvDTE — это оболочка для классов COM, с которой всегда интересно писать код. Кроме того, вы должны быть осторожны при попытке получить объект. Наивная реализация получит объект из первого загруженного экземпляра Visual Studio. Вы должны опросить Запуск таблицы объектов для поиска текущего экземпляра. После того, как он у вас есть, вы должны иметь дело с поиском в dte местоположения, которое вы ищете, иметь дело с контролем версий, заблокированными файлами и т. д. и т. д.

Работая с ним, вы начинаете понимать, для чего вообще был создан T4.

Вопрос, который вы должны задать себе: «Дает ли CodeDom достаточно, чтобы T4 не компенсировал все его недостатки?»

person Community    schedule 28.07.2010
comment
Отличный отзыв, спасибо за ответ. Я как бы подозревал, что ответ был «Нет», но хорошо, что кто-то еще подтвердил это. Как вы упомянули, T4 был разработан, чтобы облегчить жизнь, я полностью согласен - набор инструментов t4 идет еще дальше. Я, вероятно, продолжу использовать T4 для генерации кода. Как бы забавно это ни звучало, я недостаточно мотивирован для исследования EnvDTE, COM-интерфейсов, работающих таблиц объектов и т. д. :-) - person Paul Fryer; 28.07.2010