Наследование шаблона T4 от пользовательского базового класса при условии, что Visual Studio 2010 SDK не установлен

У меня есть система шаблонов T4 — выполняемых во время выполнения, а не во время компиляции — которые генерируют скелеты многих классов в моем приложении. Все эти шаблоны находятся в инструменте-генераторе, который время от времени используется для предварительной генерации новых классов в целевом приложении. Инструмент содержит класс конфигурации, свойства которого параметризируют выходные данные всех шаблонов T4.

Первоначально класс конфигурации был статическим классом. Однако по мере роста инструмента генератора классов лучше сделать его нестатическим и создавать новый экземпляр для каждого использования. Проблема в том, как передать этот экземпляр экземплярам шаблонов T4. Естественным способом кажется наследование их из общей базы, которая будет предоставлена ​​экземпляром класса конфигурации.

Проблема в том, что класс TextTransformation, который был бы унаследован моим пользовательским базовым классом T4, находится в сборке, которая (согласно источникам вроде этот SO-вопрос) не поставляется с Visual Studio 2010. Вместо этого он предоставляется в пакете SDK для Visual Studio 2010.

Базовый класс, сгенерированный VS2010, хотя сам не имеет предка, не является частичным, поэтому нет возможности «внедрить» собственного предка через другое частичное объявление.

Таким образом, вопрос в следующем: есть ли способ наследовать исполняемый во время выполнения шаблон T4 от пользовательского базового класса без необходимости установки Visual Studio 2010 SDK?

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


person Ondrej Tucny    schedule 14.01.2011    source источник


Ответы (2)


Сборка, содержащая базовый класс, действительно поставляется вместе с Visual Studio, но она устанавливается в GAC без эталонной сборки. Visual Studio SDK просто содержит версию библиотеки DLL, на которую можно ссылаться.

Следовательно, если вы создаете новый базовый класс в коде, вам понадобится VS SDK для создания этого базового класса, но не для его использования. Во время выполнения будет подхвачена версия в GAC.

person GarethJ    schedule 21.01.2011
comment
Спасибо за разъяснение этого аспекта. Я принимаю ваш ответ как правильный, однако для моего случая предложенное мной решение с базовым шаблоном T4 более жизнеспособно. Причина в том, что все в моей команде компилируют инструмент генератора в нашем основном решении, но я не хочу, чтобы VS SDK устанавливался везде только ради нескольких шаблонов T4, используемых время от времени. - person Ondrej Tucny; 22.01.2011
comment
Я понимаю ваш вариант использования - мы надеемся сделать такую ​​отдельную установку ненужной в будущем выпуске. - person GarethJ; 22.01.2011

Решение на самом деле очень простое — базовый класс может быть реализован как сам шаблон T4 и унаследован. Нравится:

Базовый шаблон:

<#@ template language="C#" #>
<#+ 

    public Config Config { get; set; }

#>

Унаследованный шаблон:

<#@ template language="C#" inherits="BaseTemplate" #>
...
<#= Config.SomeProperty #>
...

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

person Ondrej Tucny    schedule 21.01.2011
comment
Это работает хорошо, но, вероятно, следует указать, что он работает только с предварительно скомпилированными шаблонами в качестве базового класса. - person GarethJ; 22.01.2011
comment
@GarethJ Да, вы правы, я не указывал на это в своем первоначальном вопросе — я работаю с предварительно скомпилированными шаблонами. - person Ondrej Tucny; 22.01.2011
comment
Это гениальное решение! Как раз то, что мне было нужно, спасибо! - person Umar Farooq Khawaja; 02.11.2016
comment
наследование может быть нацелено на любой класс, не обязательно должен быть шаблоном (может применяться только к Runtime T4) - person Kelly Elton; 07.04.2018