Я использую T4MVC, и я не могу использовать событие перед сборкой для выполнения TextTransform.exe, поскольку он полагается на EnvDTE и должен быть выполнен с Visual Studio как хост.
Если я запустил инструмент пользователя однажды, он работает приятно, потому что он отмечает себя грязный когда его выполняемый (AlwaysKeepTemplateDirty = true
), но когда Вы открываете решение, оно не работает на сборке, таким образом, я задавался вопросом, могли ли Вы выполнить t4 через EnvDTE как событие перед сборкой?
Я придумал, как это сделать. Это не оптимально, но действительно работает. Если вы подключитесь к 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
Это определенно одна из областей T4MVC, которую я хотел бы решить, но не смог найти отличного решения. Я сделал некоторую попытку использовать событие предварительной сборки, но ничего интересного не добился. Это не значит, что это невозможно.
Извините, у меня нет решения для вас, но если кто-то что-то придумает, я буду рад интегрировать это в T4MVC.
Дэвид