2009-02-24 2 views
7

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

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

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

ответ

0

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

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

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

8

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

Link for Oleg's tutorial on code generation.

+0

Как это решает проблемы сборки? Я не уверен, что это то, что имел в виду blu, но я хочу включить автоматически сгенерированный код в мою сборку ... есть некоторый IDL-файл, который генерирует классы C#. Теперь, если другой член команды изменил IDL, я хочу, чтобы мой класс C# был перестроен. Укажите адрес шаблона? – ripper234

+0

Шаблоны T4 могут быть настроены для генерации классов для каждой сборки. Это не занимает много времени, и это хорошая практика. –

+0

@Michael: файлы никогда не должны восстанавливаться без необходимости, так как это замедляет сборку. Все, что замедляет сборку, складывается и ощущается снова и снова. Поверьте мне, когда я говорю, что эта проблема легче предотвратить, чем исправлять после того, как она хорошо установлена ​​в сборке. –

0

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

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