2010-02-26 4 views
9

Я использую T4MVC, и я не могу использовать событие pre-build для запуска TextTransform.exe, поскольку он полагается на EnvDTE и должен запускаться с Visual Studio в качестве хоста.Можете ли вы сделать RunCustomTool с EnvDTE в качестве события предварительной сборки?

Если у меня есть пользовательский инструмент один раз, он работает хорошо, потому что он отмечает себя грязным при его исполнении (AlwaysKeepTemplateDirty = true), но когда вы открываете решение, оно не запускается при сборке, поэтому мне было интересно, можете ли вы запустить t4 через EnvDTE в качестве события предварительной сборки?

ответ

16

я придумал, как сделать это. Это не оптимально, но на самом деле это работает. Если вы подключаетесь к BuildEvents.OnBuildBegin.

Вы нажимаете ALT + F11, чтобы добраться до Macro IDE, нажмите EnvironmenEvents и добавьте обработчик событий в нижеприведенный фрагмент кода. Убедитесь, что он добавлен за пределами раздела с автогенерированным кодом.

EnvironmentEvents теперь выглядит следующим образом:

Option Strict Off 
Option Explicit Off 
Imports System 
Imports EnvDTE 
Imports EnvDTE80 
Imports EnvDTE90 
Imports System.Diagnostics 

Public Module EnvironmentEvents 

    Public Sub BuildEvents_OnBuildBegin(ByVal Scope As EnvDTE.vsBuildScope, ByVal Action As EnvDTE.vsBuildAction) Handles BuildEvents.OnBuildBegin 
     If Scope = vsBuildScope.vsBuildScopeSolution Or Scope = vsBuildScope.vsBuildScopeProject Then 
      Dim projectItem As ProjectItem = DTE.Solution.FindProjectItem("T4MVC.tt") 
      If Not projectItem Is Nothing Then 
       If Not projectItem.IsOpen Then 
        projectItem.Open() 
       End If 
       projectItem.Save() 
      End If 
     End If 
    End Sub 

#Region "Automatically generated code, do not modify" 
'Automatically generated code, do not modify 
'Event Sources Begin 
<System.ContextStaticAttribute()> Public WithEvents DTEEvents As EnvDTE.DTEEvents 
<System.ContextStaticAttribute()> Public WithEvents DocumentEvents As EnvDTE.DocumentEvents 
<System.ContextStaticAttribute()> Public WithEvents WindowEvents As EnvDTE.WindowEvents 
<System.ContextStaticAttribute()> Public WithEvents TaskListEvents As EnvDTE.TaskListEvents 
<System.ContextStaticAttribute()> Public WithEvents FindEvents As EnvDTE.FindEvents 
<System.ContextStaticAttribute()> Public WithEvents OutputWindowEvents As EnvDTE.OutputWindowEvents 
<System.ContextStaticAttribute()> Public WithEvents SelectionEvents As EnvDTE.SelectionEvents 
<System.ContextStaticAttribute()> Public WithEvents BuildEvents As EnvDTE.BuildEvents 
<System.ContextStaticAttribute()> Public WithEvents SolutionEvents As EnvDTE.SolutionEvents 
<System.ContextStaticAttribute()> Public WithEvents SolutionItemsEvents As EnvDTE.ProjectItemsEvents 
<System.ContextStaticAttribute()> Public WithEvents MiscFilesEvents As EnvDTE.ProjectItemsEvents 
<System.ContextStaticAttribute()> Public WithEvents DebuggerEvents As EnvDTE.DebuggerEvents 
<System.ContextStaticAttribute()> Public WithEvents ProjectsEvents As EnvDTE.ProjectsEvents 
<System.ContextStaticAttribute()> Public WithEvents TextDocumentKeyPressEvents As EnvDTE80.TextDocumentKeyPressEvents 
<System.ContextStaticAttribute()> Public WithEvents CodeModelEvents As EnvDTE80.CodeModelEvents 
<System.ContextStaticAttribute()> Public WithEvents DebuggerProcessEvents As EnvDTE80.DebuggerProcessEvents 
<System.ContextStaticAttribute()> Public WithEvents DebuggerExpressionEvaluationEvents As EnvDTE80.DebuggerExpressionEvaluationEvents 
'Event Sources End 
'End of automatically generated code 
#End Region 

End Module 
+1

Очень приятно! Лучшее решение пока :) –

+1

Brilliant. Я думаю о различных способах использования этой точки расширения IDE. – Hal

+3

Так как это не работает в VS 2012 из-за нехватки макросов, я сделал расширение, которое делает то же самое: http://visualstudiogallery.msdn.microsoft.com/8d820b76-9fc4-429f-a95f-e68ed7d3111a. Источник на странице https://github.com/bennor/AutoT4MVC –

1

Это определенно одна из областей T4MVC, которую я хотел бы решить, но не смог найти отличное решение. Я сделал некоторая попытка вовремя использовать событие предварительной сборки, но ничего интересного не получала. Это не значит, что это невозможно.

Извините, у меня нет решения для вас, но если кто-то что-то придумает, я был бы счастлив интегрировать его в T4MVC.

Дэвид

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

  • Нет связанных вопросов^_^