Я пишу макрос для сохранения всех открытых документов, запускаю MSBuild для параллельной сборки проектов C #, а затем запускаю решение с помощью отладчика.Надежная автоматизация этих шагов сэкономит моей команде много времени.
Моя проблема в том, что я не могу заставить DTE.Debugger.Go (False) работать, когда внешняя сборка изменяет выходные файлы.
Ошибка
Невозможно привести объект COM типа 'System .__ ComObject' к типу интерфейса 'EnvDTE80.DTE2'.Эта операция завершилась неудачно, так как произошел сбой вызова QueryInterface в COM-компоненте для интерфейса с IID '{2EE1E9FA-0AFE-4348-A89F-ED9CB45C99CF}' из-за следующей ошибки: Сбой системного вызова.(Исключение из HRESULT: 0x80010100 (RPC_E_SYS_CALL_FAILED)).
OK
Вот определение макроса, которое у меня есть:
Private Function SaveAllDocuments() As Boolean
Dim doc As Document
For Each doc In DTE.Documents
If Not doc.Saved Then
If (doc.Save(doc.FullName) <> vsSaveStatus.vsSaveSucceeded) Then
Return False
End If
End If
Next
Return True
End Function
Sub ParallelBuildAndRun()
If (SaveAllDocuments() = True) Then
Dim p As System.Diagnostics.Process
Dim fileName As String
Dim args As String
fileName = "C:\Windows\Microsoft.NET\Framework\v3.5\MSBuild.exe"
args = "/p:Configuration=""" _
+ DTE.Solution.SolutionBuild.ActiveConfiguration.Name _
+ """ /m """ + DTE.Solution.FullName + """"
p = System.Diagnostics.Process.Start(fileName, args)
p.WaitForExit()
If (p.ExitCode = 0) Then
' Not even the evil DoEvents helps here.
'Application.DoEvents()
' This line will crash if the output files that are
' going to be debugged changed while in this macro
DTE.Debugger.Go(False)
End If
End If
End Sub