Генерация Кода C#

Я смотрю на создание небольшого генератора классов для проекта. Я читал о CodeDOM, поэтому семантика создания классов не кажется проблемой, но я не уверен, как лучше интегрировать поколение в процесс разработки и развертывания.

  1. Как я должен создать классы? Я прочитал, что это должно быть частью процесса сборки, как мне это сделать?

  2. где должны классы будут созданы? Я прочитал, что файлы не должны редактироваться вручную и никогда не проверялись в системе управления версиями. Должен ли я даже беспокоиться об этом и просто генерировать классы в том же каталоге, что и генератор?

3 ответов


ответы на ваш вопрос частично зависят от цели ваших сгенерированных классов.

Если классы генерируются как часть развитие, они должны быть сгенерированы как текстовые файлы и проверены в вашем SCM, как и любой другой класс.

Если ваши классы генерируются динамически при время работы в рамках работы вашей системы я бы вообще не использовал CodeDOM. Я бы использовал рефлексию.


взгляните на шаблоны T4 (он встроен в VS2008). Он позволяет создавать" шаблонные " классы, которые генерируют код для вас. Олег Сыч является бесценным ресурсом для этого.

ссылка на учебник Олега по генерации кода.


Я знаю о наличии шаблонов T4 (и знаю, что многие люди используют их), но я не использовал их сам. Помимо этого, у вас есть два основных варианта:

  1. используйте SingleFileGenerator для преобразования источника прямо внутри проекта. Всякий раз, когда вы сохраняете редактируемый документ, он автоматически восстанавливает файл кода. При использовании системы управления версиями созданный файл будет проверен как часть проекта. Есть несколько ограничений с этот:
    • вы можете создать только один выход для каждого входа.
    • поскольку вы не можете контролировать порядок создания файлов, а файлы не создаются во время сборки, ваш вывод может быть эффективно получен только из одного входного файла.
    • генератор одного файла должен быть установлен на компьютере разработчика если они планируют редактировать входной файл. Поскольку сгенерированный код находится в системе управления версиями, если они не редактируют входные данные, то они не нужно будет регенерировать выход.
    • поскольку выход генерируется только при сохранении входа, выход не должен зависеть от какого-либо состояния, кроме точного содержимого входного файла (даже системных часов).
  2. создать код как часть сборки. Для этого необходимо написать целевой файл MSBuild. Для этого у вас есть полный контроль над входами и выходами, поэтому зависимости могут быть обработаны. Состояние системы можно рассматривать как входную зависимость, когда необходимо, но помните, что каждая сборка, требующая генерации кода, занимает больше времени, чем сборка, использующая ранее сгенерированный результат. Результаты (сгенерированные исходные файлы) обычно помещаются в obj каталог и добавлен в список входов, идущих в csc (компилятор C#). Ограничения этого метода:
    • труднее написать целевой файл, чем SingleFileGenerator.
    • сборка зависит от генерации вывода, независимо от будет ли пользователь редактировать ввод.
    • поскольку сгенерированный код не является частью проекта, немного сложнее просмотреть сгенерированный код для таких вещей, как установка точек останова.