2010-02-26 3 views
9

T4MVC를 사용하고 있으며 EnvDTE를 사용하므로 TextTransform.exe를 실행하기 위해 미리 빌드 이벤트를 사용할 수 없으므로 Visual Studio에서 호스트로 실행해야합니다.빌드 전 이벤트로 EnvDTE를 사용하여 RunCustomTool을 수행 할 수 있습니까?

사용자 지정 도구를 한 번 실행 한 경우 실행시 (AlwaysKeepTemplateDirty = true) 실행할 때 더러워 지므로 잘 작동하지만 솔루션을 열면 빌드가 실행되지 않으므로 실행할 수 있는지 궁금합니다. t4를 통해 사전 빌드 이벤트로 EnvDTE?

답변

16

나는이 방법을 알아 냈습니다. 그것의 최적은 아니지만 실제로 작동합니다. BuildEvents.OnBuildBegin에 연결하면됩니다.

Macro IDE으로 가려면 ALT + F11을 누르고 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에 통합 해 드리겠습니다.

데이빗

관련 문제