Генерация кода C # - PullRequest
       26

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

7 голосов
/ 24 февраля 2009

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

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

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

Ответы [ 3 ]

8 голосов
/ 24 февраля 2009

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

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

0 голосов
/ 16 октября 2009

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

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

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

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

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

...