Доступ к сессии?
Доступ к сессии?
Есть ХОСТ для процесса компиляции. Получается имплементацией интерфеса:
public interface ITextTemplatingEngineHost { IList<string> StandardAssemblyReferences { get; } IList<string> StandardImports { get; } string TemplateFile { get; } object GetHostOption(string optionName); bool LoadIncludeText(string requestFileName, out string content, out string location); void LogErrors(CompilerErrorCollection errors); AppDomain ProvideTemplatingAppDomain(string content); string ResolveAssemblyReference(string assemblyReference); Type ResolveDirectiveProcessor(string processorName); string ResolveParameterValue(string directiveId, string processorName, string parameterName); string ResolvePath(string path); void SetFileExtension(string extension); void SetOutputEncoding(Encoding encoding, bool fromOutputDirective); }
Есть способ передать информацию об ХОСТе в обработчик директив шаблона.
public override void Initialize(ITextTemplatingEngineHost host) { //we do not need to do any initialization work }
Однако в процессе обработки встроенных директив результаты складываются не на ХОСТ, а в СЕССИЮ.
private static void ProcessTemplateDirective(Directive directive, TemplateProcessingSession session, TErrorsLog errors, ITelemetryScope scope) { session.Language = GetLanguage(); session.HostSpecific = GetHostSpecific(); session.BaseClassName = GetBaseClassName(); session.Debug = GetDebug(); session.FormatProvider = GetFormatProvider(); session.CompilerOptions = GetCompilerOptions(); session.IsPublic = GetVisibility(); session.LinePragmas = GetLinePragmas(); return; }
Вопрос на засыпку - как из просессора директивы получить доступ к этой сессии?
П.С. Та Сессия, которая доступна при генерации кода это другая сессия. Меня интересует сессия времени компиляции.
как из процессора директивы получить доступ к этой сессии
ты опять завис в своей проблеме и считаешь, что и остальные плавают где то рядом.
Скажу по секрету, что не понимаю абсолютно ничего, что именно ты делаешь. Не то что бы примерно, а вообще ничего.
не понимаю абсолютно ничего, что именно ты делаешь
-----
Унифицирую в компиляторе "шаблонов Т4" обработку директив в "шаблонах Т4".
Я знаю что понятнее не стало. Чтобы стало понятнее - надо посидеть над созданием своего хоста... ээээ... имплементацией указанного выше интерфейса и его использованием и обработчиками директив.
Если все еще непонятно - директивы в шаблонах обрабатываются внешними обработчиками. Кроме - предопределенных. Предопределенные обрабатываются внутри и не заменяются. Хочу вынести их во внешние и обрабатывать как все остальные.
Думаю что чтобы влезть с нуля нужен месяц-полтора до понимания деталей...
Ладушки - в той постановке задачи которая дана выше решения просто нет - требуемая сессия болтается сама по себе и к хосту никак не привязывается.
Так что возможное решение будет следующим:
- написать интерфейс доступа к требуемой сессии
- имплементить хост с двумя интерфейсами и местом под ссылку на сессию
- на месте создания сессии проверять наличие хоста с поддержкой второго интерфейса и помещать сессию в хост если возможно
- по месту потребления - получать интерфейс и через него - сессию.
Вроде так...
непонятно как это будет работать со Студией - там обрабатывается только доступ сессии времени генерации... да и хост заменить не получится - встроенный... и Я его пока не смотрел...
когда создается его имплементация?
-----
Где-то в недрах Студии. Пока не копал где и что именно создается. Но знаю, что там несколько версий.
Можно и свою написать...не шибко сложно... и подсунуть компилятору... вроде... Я пока не смотрел - ковыряю "движек" компилятора - там точно можно - один из обязательных параметров.
Может там можно передать сессию?
------
Отдельно сессию передать нельзя - нет метода/параметра/проперти для передачи, а менять списки параметров мне сильно не хочется - совместимость пропадет.
Даже над тем куда поместить дополнительный интерфейс надо сильно подумать.
добавить проперть в имплементацию должно быть совершенно безопасно
-----
Ээээ... добавить - да, беспроблемно.
Осталось передать интерфейс хоста... и обратится к проперти... через интерфейс... потому как по-другому - низзя, несовместимо будет...
Интерфейс хоста, если что, приведен выше. Лежит в Microsoft.VisualStudio.TextTemplating.Interfaces.10.0.dll. Переопределятся, естественно, не будет.
на каком этапе ты влазишь в студию
-----
Студия, при вызове компилятора, передает ему свой хост.
Должна. Где, когда и какой именно создается - не знаю.
Есть отдельный компилятор - надо смотреть что там за хост.
Если есть интерес - еще один хост есть в DSL...
Но у Студии - другой... Знаю, что сильно повязан на Студию... типа internal для нее...
Что интересно - ни одной полноценной реализации хоста не приводится.
Все что удалось нарыть - частичные, иллюстративные...
Редко требующиеся моментики....
того, что ты хочешь система не предназначена
-----
Ну так в посте #3 так и написано...
А чуть выше написал как можно решить...
Самое смешное - обработка одной из встроенных директив написана именно как Процессор Директив...
Но там манипуляция только с хостом...
В принципе, уже слепил расширенный хост и начал выносить код обработки в Процессора Директив...
Только это на пару дней... если голова не разболится...
Написалось так:
определены два интерфейса:
[CLSCompliant(true)] public interface ITextTemplatingTemplateProcessingSessionHost { ITemplateProcessingSession TemplateProcessingSession { get; set; } } [CLSCompliant(true)] public interface ITemplateProcessingSession { bool ProcessedOutputDirective { get; set; } }
Далее пишется имплементация в хосте
public class TTextTemplatingTemplateProcessingSessionHost : MarshalByRefObject , ITextTemplatingEngineHost , ITextTemplatingSessionHost , ITextTemplatingTemplateProcessingSessionHost { ..... ITemplateProcessingSession ITextTemplatingTemplateProcessingSessionHost.TemplateProcessingSession { get; set; } }
Имплементация ITemplateProcessingSession аналогична и тоже в порядке.
и наконец простой код
ITextTemplatingTemplateProcessingSessionHost host = PassedHost as ITextTemplatingTemplateProcessingSessionHost; host?.TemplateProcessingSession?.ProcessedOutputDirective = true;
Вопрос в следующем.
Интеллисенсе показывает, что ProcessedOutputDirective имеет геттер и сеттер.
А в ошибках появляется:
Error CS0131 The left-hand side of an assignment must be a variable, property or indexer
...\OutputDirectiveProcessor.cs 117 Active
Вот сижу и чешу репу - что за хрень?
аааа.... потер лишку - имя проекта... А оно какую-то ролЮ играет?
Ну тогда такое будет Microsoft.VisualStudio.TextTemplating.15.0.A
Полный путь к филеЮ тожА нужОн?
C:\Projects\Ms.Vs.TextTemplating\Microsoft.VisualStudio.TextTemplating.15.0.A\VisualStudio.TextTemplating\DirectiveProcessor\OutputDirectiveProcessor.cs
По сути вопроса то хоть что-то сможешь сказать?
https://www.nuget.org/packages/Microsoft.VisualStudio.Text...
Если длл-ка то ее значит можно собрать на нормальной машине. Где то что у тебя не так.
Где то что у тебя не так.
------
Ну так Я и спрашиваю - какие есть идеи по поводу того, почему проперти, у которой имплементированы геттер и сеттер (пусть и дефолтные), нельзя присвоить значение?!... Что Я МОГ напутать? Там ОДНА строка... она либо есть и тогда не должно быть ошибки, либо нет и тогда есть другая ошибка - не имплементирован интерфейс...
Так ты что не можешь создать Длл-ку из исходников?
-----
Ээээ... а у тебя получается их создавать при наличии синтаксических ошибок?
А вот откуда там появляется ошибка Я как раз и не могу понять - вроде все правильно...
Зачем самому ее собирать?
------
Создай пустой проектик в Студии.
Добавь визардом Runtime Text Template шаблончик в проект.
Посмотри на сгенерированный код.
Теперь надо сделать следующее:
- на сгенерированный класс надо повесить дополнительный аттрибут с данными автора, пока можно просто залогиненного юзера
- добавить два метода - статический Call() и виртуальный Prim2(). Обоим нужен список параметров из директив Parameters. Параметры через сессию передавать не нужно.
Это - для каждого обрабатываемого шаблона.
пока хватит - позднее, разумеется, надо будет добавлять что-то еще.
Ааа... вот еще задачка - шаблоны поделить на шаблоны и суб-шаблоны... Разница - "вызов" шаблона выполняется из вне, а суб-шаблона - из другого (суб-)шаблона. Тут рекурсию надо ограничить...
Ах, да... забыл... ручной работы с шаблоном быть не должно - максимум - поменять параметры компилятора шаблонов. Это где-то в targets'ах или другой Custom tools...
Вопрос решается довольно просто, если подменить обработчики директив.
Но!.. встроенные обработчики не заменяются - они впихнуты в компилятор шаблонов... биллина поделка - в документации прописано как должно быть... и сделано как получилось...
Вот Я и занимаюсь вытаскиванием обработчиков директив и генерации кода во вне компилятора, чтобы их можно было поменять на нужные...
Выделил, перенес, добавил что необходимо... и получил непонятную ошибку по которой задал вопрос... пока непонятно что за проблема.
Хочешь значит свое что то добавить...
Не нашел я оригинала только форк
https://github.com/SubSonic-Core/SubSonic.Core.TextTemplat...
И раньше что то от тебя было