C # Как генерировать код из кода - PullRequest
7 голосов
/ 02 мая 2010

Можно ли сгенерировать и построить некоторый код на C # на основе кода из того же проекта. Я пробовал с T4 и Reflection, но есть некоторые проблемы с блокировкой сборки. Есть ли другой способ?

Ответы [ 5 ]

1 голос
/ 02 мая 2010

Этот пример от Олега Сыча использует механизм самоанализа FXCop вместо отражения. Таким образом, сборки не блокируются.

К сожалению, Reflection оптимизирован для выполнения кода. Один конкретный ограничение делает его неподходящим для генерация кода - сборка загружена используя Reflection можно только выгрузить с его AppDomain. Потому что Т4 шаблоны компилируются в .NET сборки и кэшируются для улучшения производительность генерации кода, используя Отражение для доступа к компоненту сборка заставляет T4 заблокировать это.

В качестве альтернативы, если вы ориентируетесь только на классы Linq to SQL, вы можете генерировать код из файла dbml вместо кода, который L2S генерирует из dbml. У меня есть пример чего-то похожего (файл edmx) в моем блоге .

1 голос
/ 02 мая 2010

Отражение прекрасно работает для меня. Вы можете обойти проблемы с блокировкой сборки, изолировав свою задачу сборки в отдельный домен приложений внутри VS. После завершения задачи все сборки, которые вам нужно использовать для генерации кода, будут выгружены вместе с AppDomain задачи. См. AppDomainIsolatedTask.

1 голос
/ 02 мая 2010

Вы определенно можете написать свой собственный генератор кода, все на C # - в конце концов, генерируемый «код» - это просто текстовый файл, который вы записываете.

Но что не так с шаблонами T4? Они предлагают множество функций, которые вам не нужно заново изобретать - почему бы не использовать их? Не могли бы вы рассказать нам подробнее, какие у вас проблемы с T4?

T4 - это на самом деле просто набор классов в .NET, так что вы определенно можете написать свой собственный генератор кода, обрабатывающий некоторую логику, и использовать T4 для создания шаблонов и замены этих значений шаблона. Но опять же: для того, чтобы помочь вам диагностировать проблемы с Т4, нам нужно знать о них больше ...

0 голосов
/ 02 мая 2010

Это действительно зависит от того, чего именно вы пытаетесь достичь, но в общем случае я бы рекомендовал использовать шаблоны T4.

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

Если вы хотите сгенерировать код на основе некоторых классов, которые вы определили в одном и том же проекте - это не похоже на что-то легко достижимое (в конце концов, вы хотите скомпилировать некоторые классы в текущем проекте, сгенерировать код на основе на них и после этого генерировать классы снова ... ммм ...?)

Но если вы хотите сохранить некоторые настройки, а затем запустить шаблон T4 и сгенерировать некоторый код на основе этих настроек - это легко достижимо. T4MVC является примером (они генерируют код на основе файла настроек, который копируется и сохраняется в проекте вместе с шаблоном T4). Этот шаблон также просматривает текущие файлы, доступные в решении, и генерирует строковые константы на основе каждого файла. Такого рода звуки могут помочь вам решить вашу проблему, какой бы она ни была:

Если вы все еще не уверены - вы можете указать более подробную информацию о том, что вы хотите сделать, и мы постараемся вам помочь:)

0 голосов
/ 02 мая 2010

Существует сторонний вариант C # .NET JavaCC, который мы используем на работе.

Также интересная статья о том, как ее сделать: http://msdn.microsoft.com/en-us/magazine/cc136756.aspx

...