C#, Как сгенерировать код из кода

Действительно ли возможно генерировать и создать некоторый код c# на основе кода из того же проекта. Я попробовал T4 и Отражением, но существуют некоторые проблемы блокировки блока. Есть ли какой-либо другой путь?

7
задан Marko 2 May 2010 в 17:38
поделиться

5 ответов

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

1
ответ дан 7 December 2019 в 16:40
поделиться

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

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

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

1
ответ дан 7 December 2019 в 16:40
поделиться

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

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

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

1
ответ дан 7 December 2019 в 16:40
поделиться

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

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

0
ответ дан 7 December 2019 в 16:40
поделиться

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

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

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

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

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

0
ответ дан 7 December 2019 в 16:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: