Использование сборок .NET Core в шаблонах T4

В настоящее время мы переносим проект с .NET Framework на .NET Core 3.1, и у нас возникла проблема с тем, чтобы заставить работать некоторые из наших шаблонов T4. Эти шаблоны импортируют одну или несколько сборок из нашего решения для генерации кода с использованием отражения. Сборки представляют собой библиотеки .NET Core 3.1. Проблема, похоже, в том, что движок T4 в Visual Studio 2019 работает на Framework и не может правильно загрузить сборки Core.

При запуске шаблонов я получаю ReflectionTypeLoadException. После проверки исключения становится ясно, что двигатель T4 не может найти System.Runtime. Для этого есть обходной путь (здесь), но когда я применяю это, это просто перемещает проблему в следующую зависимость, которая пакет NuGet. Таким образом, обходной путь не работает.

Есть ли способ заставить шаблоны T4 работать со сборками .NET Core 3.1? Или есть какая-либо аналогичная альтернатива шаблонам T4, которая работает с .NET Core 3.1?


person qrjo    schedule 10.02.2020    source источник
comment
Существует (повторная) реализация T4 с открытым исходным кодом, которая работает на .NET Core. Однако он не очень активен, и для поддержки Core 3, очевидно, требуется немного возиться, поскольку in, получая пакеты предварительного просмотра прямо из источника.   -  person Jeroen Mostert    schedule 10.02.2020
comment
Может быть, вы можете переписать шаблоны и вместо того, чтобы полагаться на рефлексию для извлечения информации из скомпилированных сборок, получать информацию из файлов кода? Чтобы понять, о чем я говорю, взгляните на этот пример.   -  person Reza Aghaei    schedule 10.02.2020
comment
@JeroenMostert Я видел этот проект, но я просто не мог заставить работать предварительный просмотр и не мог заставить работать эту переменную среды. Кроме того, я использую .NET Core 3.1, а не 3.0.   -  person qrjo    schedule 10.02.2020
comment
@RezaAghaei Это интересное предложение, но я не думаю, что это сработает. Мы полагаемся на наследование интерфейса / класса в наших шаблонах.   -  person qrjo    schedule 10.02.2020
comment
@qrjo Я думаю, что это будет подход, но вам нужно изменить все ваши шаблоны t4 для ретрансляции на CodeClass, CodeProperty, CodeType, CodeInterface, .... Однако это будет дорогостоящее изменение.   -  person Reza Aghaei    schedule 10.02.2020
comment
Вы можете попробовать использовать Mono.TextTemplating для создания своих шаблонов? Это больше инструмент разработки, чем пользовательский интерфейс, но шаблоны генерируют   -  person Thundter    schedule 12.02.2020
comment
@Thundter Это уже было предложено Джероеном, но, к сожалению, он не поддерживает .NET Core 3.1.   -  person qrjo    schedule 12.02.2020


Ответы (1)


У меня была эта проблема, и я не мог найти хороших решений. Поэтому я разработал альтернативный инструмент T4, который использует гибрид возможностей Visual Studio .NET Framework T4 для предварительной обработки и исполняемого файла .NET Core для выполнения кода шаблона. Он доступен на GitHub. Это хорошо работает для моего проекта и, надеюсь, может помочь некоторым другим.

person RdJ    schedule 20.03.2020
comment
К сожалению, не поддерживает директиву include и не работает с Linq2db. - person Maxim; 14.04.2021
comment
@Maxim Оба эти утверждения неверны. Директива include должна работать нормально, а для Linq2db вам нужно будет ссылаться на правильные сборки, используя директиву сборки. Если у вас возникнут проблемы, создайте проблему в проекте GitHub. - person RdJ; 15.04.2021