Может ли CodeDom добавлять файлы исходного кода в проект? - PullRequest
2 голосов
/ 28 июля 2010

Я использовал 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 просто выводит файл на диск и не обновляет файл проекта.

Вот изображение:

alt text

Ответы [ 2 ]

3 голосов
/ 28 июля 2010

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

1 голос
/ 28 июля 2010

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

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

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

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

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

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

...