【问题标题】:Can you do a RunCustomTool with EnvDTE as a pre-build event?您可以使用 EnvDTE 执行 RunCustomTool 作为预构建事件吗?
【发布时间】:2010-02-26 13:01:42
【问题描述】:

我正在使用 T4MVC,我不能使用预构建事件来运行 TextTransform.exe,因为它依赖于 EnvDTE,并且必须以 Visual Studio 作为主机运行。

如果我曾经运行过自定义工具,它会很好地工作,因为它在执行时将自己标记为脏 (AlwaysKeepTemplateDirty = true),但是当您打开解决方案时,它不会在构建时运行,所以我想知道您是否可以通过 EnvDTE 运行 t4 作为预构建事件?

【问题讨论】:

    标签: .net macros t4 envdte t4mvc


    【解决方案1】:

    我想出了一个办法。它不是最佳的,但它确实有效。如果你连接到 BuildEvents.OnBuildBegin.

    按 ALT+F11 进入Macro IDE,点击EnvironmenEvents 并在下面的代码 sn-p 中添加事件处理程序。确保将其添加到自动生成的代码部分之外。

    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
    

    【讨论】:

    • 非常好!最好的解决方案:)
    • 太棒了。我正在考虑使用该 IDE 扩展点的各种方法。
    • 由于缺少宏,这在 VS 2012 中不起作用,我做了一个扩展,它做同样的事情:visualstudiogallery.msdn.microsoft.com/…。来源github.com/bennor/AutoT4MVC
    • 对于找不到EnvironmenEvents 的任何人(比如我),打开View \ Class View 菜单并在类视图中展开根命名空间。 EnvironmentEvents 在那里。
    【解决方案2】:

    这绝对是我想解决的 T4MVC 领域之一,但还没有找到很好的解决方案。我当时确实一些尝试使用预构建事件,但没有得到任何有趣的地方。这并不意味着它不能完成。

    抱歉,我没有适合你的解决方案,但如果有人想出一些东西,我很乐意将它集成到 T4MVC 中。

    大卫

    【讨论】:

      猜你喜欢
      • 2012-01-10
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多