Простая и практичная генерация кода на C # (VS 2008 или 2010) - PullRequest
2 голосов
/ 12 ноября 2009

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

Есть ли простой способ интегрировать сгенерированный во время сборки код в приложение?

Код, о котором я думаю, похож на файл ресурсов и настроек Генерация кода, которую Visual Studio выполняет:

  • Имея значение intellisense здесь ценно
  • Существует множество свойств и связей между свойствами, которые тривиально описать, но невозможно кратко реализовать в C #.
  • Базовый ресурс может быть изменяем, и код автоматически восстанавливается без необходимости какого-либо взаимодействия с пользователем и без необходимости разбираться во внутренних особенностях генератора.

Для (нереального) примера рассмотрим прекомпилятор, который сгенерировал средство доступа к именованным группам захвата Regex через свойства (или методы) C # с одинаковыми именами. Это типично для тех вещей, которые я хотел бы сгенерировать: длинные фрагменты шаблонных упаковщиков, основная функция которых - включить проверку времени компиляции на наличие ошибок (в приведенном выше; доступ к несуществующим группам захвата или запись и недопустимое регулярное выражение) и отсутствие менее важно, intellisense для этих свойств. Наконец, эта установка должна легко использоваться другими членами команды с минимальным уровнем кривой обучения. То есть, абсолютно недопустимо требовать ручного вмешательства для регенерации кода, а также не допускать фиксации сгенерированного кода в системе контроля версий. В худшем случае всем нужно просто установить какое-то расширение; в идеале расширение должно быть установлено в дерево исходных текстов, чтобы любой, кто проверяет дерево, мог построить проект без какого-либо представления.

Чтобы это работало хорошо, важно, чтобы интеграция IDE была превосходной: Обновление базового файла определения "ресурса" должно вызвать регенерацию кода без какого-либо взаимодействия с пользователем, и в идеале сам генератор должен был бы в дальнейшем его будет легко поддерживать другим разработчикам (т. е. некоторое количество возможностей отладки генератора является плюсом).

Наконец, XSLT-подобный подход, в котором один и тот же шаблон может применяться к различным входным ресурсам , является идеальным; и потому, что это означает, что вам даже не нужно смотреть на фактический код генератора, если все, что вам нужно, это обновить ресурс, и потому что это делает повторное использование шаблона тривиальным.

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

Существует ли лучшее (более чистое) решение или какой-либо способ запуска T4, чтобы один и тот же шаблон можно было повторно использовать и (так же, как файлы настроек .NET), чтобы любое обновление ресурса автоматически вызывало регенерацию реализованного кода

Резюме: Я ищу подход с генерацией кода, который может

  1. Регенерация кода автоматически без вмешательства разработчика при изменении базового ресурса (не шаблона!).
  2. Будьте несколько просты в обслуживании
  3. Иметь возможность совместно использовать один и тот же шаблон генератора для нескольких ресурсов (что из пункта 1, вероятно, подразумевает, что ресурс должен ссылаться на генератор, а не наоборот).

Ответы [ 2 ]

6 голосов
/ 12 ноября 2009

Вы можете использовать T4ScriptFileGenerator из T4 Toolbox . Измените свойство «Пользовательский инструмент» для файла «ресурсов» на T4ScriptFileGenerator и сохраните изменения. Пользовательский инструмент сгенерирует новый пустой скрипт T4 (файл .tt). Поместите логику генерации кода в этот файл .tt. Каждый раз, когда вы изменяете (и сохраняете) файл ресурса, T4ScriptFileGenerator будет использовать файл .tt для генерации выходного кода. Для примера того, как это работает, см. Генератор «LINQ to SQL Model» в T4 Toolbox, который использует файл .dbml в качестве «ресурса». В файле .tt, созданном этим генератором, вы увидите, что вся логика генерации кода находится в отдельных файлах .tt и повторно используется с помощью директив include .

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

Возможно, вы захотите следить за ABSE (http://www.abse.info). ABSE - это методология разработки программного обеспечения, основанная на генерации кода и модели, которая полностью независима с точки зрения платформы и языка, поэтому у вас не будет никакой проблема в создании ваших собственных генераторов для C # и всего, что вы пожелаете. Большим плюсом является то, что вы можете генерировать код именно так, как вам хочется. Недостатком является то, что сначала у вас может быть больше работы для создания шаблонов.

ABSE позволяет вам захватить ваши знания предметной области в «атомы», которые в основном представляют собой фрагменты более крупных моделей, которые вы можете построить. ABSE является декларативным и исполняемым. Модель может генерировать код по вашей спецификации и включать пользовательский код на уровне модели.

К сожалению, ABSE все еще находится в стадии разработки, и интегрированная среда разработки (названная AtomWeaver) все еще находится в стадии разработки. В любом случае релиз CTP генератора запланирован на январь 2010 года, поэтому мы уже близки к этому.

...