2014-10-03 2 views
11

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

Кто-нибудь знает способ сделать это?

В качестве альтернативы, я знаю, что существует ошибка() & Методы предупреждения() для сброса данных в панель «Список ошибок», есть ли что-то подобное для сброса информационных сообщений?

+0

Может быть, я ошибаюсь, но вы могли бы войти в окно вывода, если бы выполните ваши шаблоны в режиме отладки –

+0

Вы можете поместить 'System.Diagnostics.Debug.WriteLine' в свои файлы T4. Вы также можете выполнить разрыв с 'System.Diagnostics.Debugger.Break'. –

+3

Спасибо людям. Calling System.Diagnostics.Debug.WriteLine() не работает. Я боюсь. – jamiet

ответ

0

Для окна вывода:

<#@ template debug="true" hostspecific="true" language="C#" #> 
<#@ assembly name="EnvDTE" #> 
<#@ import namespace="EnvDTE" #> 
<#@ import namespace="System.Runtime.InteropServices" #> 
<#@ output extension=".txt" #> 

<# 
var hostServiceProvider = (IServiceProvider)this.Host; 
var dte = (DTE)GetCOMService(hostServiceProvider, typeof(DTE)); 
var window = dte.Windows.Item(EnvDTE.Constants.vsWindowKindOutput); 
var outputWindow = (OutputWindow) window.Object; 
outputWindow.ActivePane.Activate(); 
outputWindow.ActivePane.OutputString("Hello world, this is T4 template"); 
#> 

<#+ 
private object GetCOMService(IServiceProvider provider, Type type) 
{ 
    object result = provider.GetService(type); 
    if (result == null) 
    { 
    return result; 
    } 

    try 
    { 
    return Marshal.GetObjectForIUnknown(Marshal.GetIUnknownForObject(result)); 
    } 
    catch (Exception) 
    { 
    return result; 
    } 
} 
#> 
+0

где находится hostServiceProvider. –

+0

@ DylanHayes - я включил полный оригинальный шаблон; по существу его интерфейс, указывающий на активную визуальную студию (this.Host); и доступен только для шаблонов hostspecific = "true" T4. –

+0

потрясающий! thx для справки, я в конечном итоге выяснил это вскоре после того, как я спросил комментарий, но теперь он будет там для других, которые могут спасти людей некоторое время. TY! –

7

Это не совсем то, что вы просили, но вы можете debug a T4 template from within visual studio, просто щелкните правой кнопкой мыши «Debug T4 шаблон».

Если вы делаете это, достаточно легко сохранить состояние, которое вы отправляете в окно вывода в переменной где-нибудь.

4

На основании ответа Ондрей, я написал удобную функцию, которую я использовал для отладки моих шаблонов:

private void WriteToOutput(string output) 
{ 
    IServiceProvider hostServiceProvider = (IServiceProvider)Host; 
    if (hostServiceProvider == null) 
    throw new Exception("Host property returned unexpected value (null)"); 

    EnvDTE.DTE dte = (EnvDTE.DTE)hostServiceProvider.GetService(typeof(EnvDTE.DTE)); 
    if (dte == null) 
    throw new Exception("Unable to retrieve EnvDTE.DTE"); 

    var window = dte.Windows.Item(EnvDTE.Constants.vsWindowKindOutput); 
    var outputWindow = (OutputWindow) window.Object; 
    outputWindow.ActivePane.Activate(); 

    outputWindow.ActivePane.OutputString(output); 
    outputWindow.ActivePane.OutputString("\n"); 
} 
+0

Это больше не работает в VS 2017. Я получаю '' 'SerializationException''' в строке, которая устанавливает переменную окна. – bzuillsmith

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