• EnvDTE ヘルプのルート的な場所
  • _DTE プロパティ マクロ内でいきなりDTEと書くと_DTEインターフェースをさす。
  • マクロは
    Public Sub ~()
    End Sub
    
    • で書くとコマンドとしてVCから使えるようになる。Functionではだめ。
  • ソリューションを開く
    DTE.Solution.Open("(sln_path)")
    
  • 特定のビルド構成を選択
    DTE.Solution.SolutionBuild.SolutionConfigurations.Item("(config_name)").Activate()
    
  • リビルド
    DTE.Solution.SolutionBuild.Clean(True)	'TrueでCleanが終わるのを待つ。
    DTE.Solution.SolutionBuild.Build(True)	'TrueでBuildが終わるのを待つ。
    
    • インストーラプロジェクトがビルドされない。
      Imports EnvDTE
      Imports System.Diagnostics
      
      Public Module UserCreated
          Public Sub ReBuildAndRun()
              AddHandler DTE.Events.BuildEvents.OnBuildDone, AddressOf AfterBuild
              DTE.ExecuteCommand(”Build.RebuildSolution”)
          End Sub
          Public Sub AfterBuild(ByVal Scope As EnvDTE.vsBuildScope, ByVal Action As EnvDTE.vsBuildAction)
              RemoveHandler DTE.Events.BuildEvents.OnBuildDone, AddressOf MyMacros.UserCreated.AfterBuild
              DTE.Debugger.Go(True)
          End Sub
      End Module
      
    • これならいけた。
    • (Ref: http://www.4guysfromviewpoint.com/?p=50 )
  • 終了
    DTE.Quit()
    
  • ログの保存
    'ログ
    'まず出力バッファの内容を取得
    Dim text_document As TextDocument
    text_document = DTE.ToolWindows.OutputWindow.ActivePane.TextDocument
    '次に保存
    DTE.ItemOperations.NewFile("全般\テキスト ファイル")
    DTE.ActiveDocument.Object("TextDocument").Selection.Insert(text_document.StartPoint.CreateEditPoint.GetText(text_document.EndPoint))
    DTE.ActiveDocument.Save("(log_path)")
    DTE.ActiveDocument.Close(EnvDTE.vsSaveChanges.vsSaveChangesNo)
    
    • デバッグ環境以外だと正しいビルドログが変数として取れないことがある。
    • ログのパスを引数から取ろうとしてもdevenvのコマンドラインに不正なコマンドを入れると起こられるので/logの引数にするとしてもロングファイル名の問題とか、/logの引数のファイル自体はdevenvが読み書き共有なしで開いてるとかの問題がある。
    • とりあえず現状はプロジェクトごとにビルドログをとってマージしている
      • もうちょっとスマートにやる方法ないものか…