2013-05-21 1 views
0

Я пытаюсь написать консольную программу, которая принимает имя файла шаблона T4 в качестве параметра, а затем обрабатывает шаблон. Это потому, что я хочу, чтобы пользователи могли обновлять шаблон без необходимости перекомпилировать программу.Выполнение шаблона T4: Host имеет значение null, а hostpecific = "True"

Самое простое решение, которое я нашел в том, чтобы создать второй шаблон внутри Visual Studio, что precompiles в C# класс, который, в свою очередь, выполняет мой внешний шаблон «Template.tt»:

<#@ template language="C#" hostspecific="True" #> 
<#@ import namespace="System.IO" #> 
<#@ import namespace="Microsoft.VisualStudio.TextTemplating" #> 
<# 
    string template = File.ReadAllText(Host.ResolvePath("Template.tt")); 
    Engine engine = new Engine(); 
    string output = engine.ProcessTemplate(template, Host); 
    Write(output); 
#> 

в пределах Program.cs моей программы консоли, я затем выполнить эту «Calling» шаблон:

string templateText = new Caller().TransformText(); 

Проблема заключается в том, что, когда я запускаю этот (F5), он бросает NullReferenceException на первой линии в шаблоне вызывающего абонента, потому что хост является недействительным.

Однако, я думал, что установка hostpecific на True даст мне Host.

Что мне нужно сделать, чтобы получить Хост? На самом деле, я не хочу отказываться от своих собственных. В качестве альтернативы, есть ли лучший способ выполнить внешний шаблон T4?

ответ

0

В соответствии с MSDN documentation атрибут hosts предоставляет только доступ к Host-Property внутри шаблона t4. Это не гарантирует наличие хоста. Для шаблонов времени разработки (которые преобразуются в визуальной студии) Visual Studio и этот движок T4 предоставляют этот хост. К сожалению, Microsoft.VisualStudio.TextTemplating.dll не является распространяемой сборкой. Таким образом, у вас не будет этого хоста во время выполнения.

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

Если пользователи должны писать/изменять шаблоны t4, они имеют знания о программировании и написание текста шаблонам. Не могли бы вы подумать о том, как можно использовать визуальную студию?

В качестве альтернативы (если изменения, внесенные пользователем, невелики), вы можете попробовать использовать предварительно скомпилированный шаблон, который работает с каким-либо другим вводом (xml-файл, ini-file, параметры командной строки, ...).

Извините за не имея лучшие новости ...

0

Фактический заказ (на основе командной строки приложение) T4 хозяин не слишком сложно реализовать, я не помню, мне голову, где я получил код, но здесь являются звенья нашей T4 модульной консоли приложения бегуна: https://github.com/abstractiondev/absbuilder

Реальная командная строка хоста здесь: https://github.com/abstractiondev/absbuilder/blob/master/AbstractionBuilder/CustomCmdLineHost.cs

Для ссылки на T4 части, мы запустили набор инструментов с Mono во время выполнения/сред Monodevelop в Linux, теперь основанный на тестах (то есть 1-2 года назад), я помню, что T4 MonoDevelop полностью совместим и доступен как исходный код с очень разумным лицензированием (MIT или Apache 2.0, если я правильно помню).

Смежные вопросы