"Присоединить к процессу" как событие после сборки

У меня есть приложение, которое работает под "w3wp.процесс exe".

во время отладки я часто выполняю следующие шаги:

1 - внести некоторые изменения

2 - построить проект

3-присоединить к " w3wp.exe "с помощью диалогового окна" прикрепить к процессу "в меню "Сервис".

4-выполните некоторые действия в приложении, чтобы выполнить мой код, чтобы я мог пройти через него в отладчике

Я хотел бы автоматизируйте Шаг 3 в сценарии после сборки, чтобы среда IDE автоматически подключалась к процессу после завершения сборки. Обратите внимание, что я уже запускаю приложение как часть процесса после сборки, поэтому я могу рассчитывать на процесс, существующий на данный момент.

кто-нибудь знает способ автоматизации команды "прикрепить к процессу"? Что-то из командной строки было бы особенно хорошо, но макрос тоже подойдет.

Я использую Visual Studio 2008 под Windows 7, 64 немного.

редактировать @InSane в основном дал мне правильный ответ, но он не работает, потому что мне нужно отлаживать управляемый код, а не собственный код. Кажется, что vsjitdebugger по умолчанию использует собственный код, и поэтому моя точка останова не попадает. Изнутри IDE я могу указать "управляемый код", и отладчик подключается, как ожидалось. Итак, есть ли способ указать vsjitdebugger на управляемый код?

4 ответов


Я, наконец, смог решить эту проблему с примером, который я нашел в другом месте в интернете. Я разделяю его здесь, так как это было полезно для меня.

1-Создайте новое приложение командной строки с приведенным ниже кодом (этот пример находится в VB.NET).

Option Strict Off
Option Explicit Off
Imports System
'On my machine, these EnvDTE* assemblies were here:
'C:\Program Files (x86)\Common Files\microsoft shared\MSEnv\PublicAssemblies
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports System.Diagnostics
Imports System.Threading

Module modMain
    Function AttachToProcess(ByVal processName As String, _
                             ByVal Timeout As Integer) As Boolean
        Dim proc As EnvDTE.Process
        Dim attached As Boolean
        Dim DTE2 As EnvDTE80.DTE2

        Try
            DTE2 = _
            System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.9.0")

            For Each proc In DTE2.Debugger.LocalProcesses
                If (Right(proc.Name, Len(processName)).ToUpper = processName.ToUpper) Then
                    proc.Attach()
                    System.Threading.Thread.Sleep(Timeout)
                    attached = True
                End If
            Next
        Catch Ex As Exception
            Console.Write("Unable to Attach to Debugger : " & Ex.Message)
        End Try

        Return attached
    End Function

    Sub Main()
        'to call w/ Command Line arguments follow this syntax
        'AttachProcess <<ProcessName>> <<TimeOut>>
        'AttachProcess app.exe 2000
        Dim AppName As String = "w3wp.exe"
        Dim TimeOut As Integer = 20000 '20 Seconds
        Try
            If Environment.GetCommandLineArgs().Length > 1 Then
                AppName = Environment.GetCommandLineArgs(1)
            End If

            If Environment.GetCommandLineArgs().Length > 2 Then
                If IsNumeric(Environment.GetCommandLineArgs(2)) Then
                    TimeOut = Environment.GetCommandLineArgs(2)
                End If
            End If
            Environment.GetCommandLineArgs()
            AttachToProcess(AppName, TimeOut)
            Console.WriteLine("Attached!!")

        Catch Ex As Exception
            Console.Write("Unable to Attach to Debugger : " & Ex.Message)
        End Try
    End Sub
End Module

2-Откройте решение, которое требуется отладить в Visual Studio

3-в конце событий "после сборки" введите вызов этой новой утилиты, как в:

c:\AutoAttach.exe w3wp.exe 20000

4-Создайте свой применение


вы можете попробовать следующую команду из командной строки Windows.

если он работает так, как вы ожидаете, вы можете поместить его как часть ваших шагов postbuild.

ProcessID-это идентификатор запущенного процесса, к которому вы хотите подключиться.

vsjitdebugger.exe -p ProcessId 

другие параметры для использования этого из командной строки включают :- alt text


вот функция PowerShell, вдохновленная ответом @JosephStyons. Работает с любой версией VS без изменений.

function Debug-ProcessVS([int] $processId)
{
    $vsProcess = Get-Process devenv | Select-Object -First 1
    if (!$vsProcess) {throw "Visual Studio is not running"}
    $vsMajorVersion = $vsProcess.FileVersion -replace '^(\d+).*', ''
    $dte = [System.Runtime.InteropServices.Marshal]::GetActiveObject("VisualStudio.DTE.$vsMajorVersion.0")
    $debugee = $dte.Debugger.LocalProcesses | ? {$_.ProcessID -eq $processId}
    if (!$debugee) {throw "Process with ID $processId does not exist."}
    $debugee.Attach()
}

вот улучшенная версия Джозефа. Я добавил Это: - не показывать консоль (установите в своем проекте в" Application "тип вывода на "Windows Application".) - я установил аргумент командной строки timeout в 0 (зачем это вообще нужно?) - добавлена третья командная строка ARG url, которая запускается с firefox, но только после того, как сайт сначала загружается внутри программы. это связано с тем, что некоторые сайты, особенно dotnetnuke, занимают много времени для загрузки после компиляции. таким образом, firefox выведет вас на передний план браузер firefox только после того, как все готово к тестированию, занимает до 1 минуты на моем компьютере. а пока можешь поработать над чем-нибудь другим. ПС. этот редактор stackoverflow немного глуп. вот почему этот текст не отформатирован красиво. если я добавлю список бюллетеней, код ниже не будет отображаться как код.

Option Strict Off
Option Explicit Off
Imports System
'On my machine, these EnvDTE* assemblies were here:
'C:\Program Files (x86)\Common Files\microsoft shared\MSEnv\PublicAssemblies
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports System.Diagnostics
Imports System.Threading
Imports System.Collections.Generic
Imports System.Linq
Imports System.Text
Imports System.Net

Module modMain
    Function AttachToProcess(ByVal processName As String, _
                             ByVal Timeout As Integer) As Boolean
        Dim proc As EnvDTE.Process
        Dim attached As Boolean
        Dim DTE2 As EnvDTE80.DTE2

        Try
            DTE2 = _
            System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.11.0")

            For Each proc In DTE2.Debugger.LocalProcesses
                If (Right(proc.Name, Len(processName)).ToUpper = processName.ToUpper) Then
                    proc.Attach()
                    System.Threading.Thread.Sleep(Timeout)
                    attached = True
                    Exit For
                End If
            Next
        Catch Ex As Exception
            Console.Write("Unable to Attach to Debugger : " & Ex.Message)
        End Try

        Return attached
    End Function

    Sub Main()
        'to call w/ Command Line arguments follow this syntax
        'AttachProcess <<ProcessName>> <<TimeOut>>
        'AttachProcess app.exe 2000
        Dim AppName As String = "w3wp.exe"
        Dim TimeOut As Integer = 20000 '20 Seconds
        Dim Url As String = "http://www.dnndev.me/"
        Try
            If Environment.GetCommandLineArgs().Length > 1 Then
                AppName = Environment.GetCommandLineArgs(1)
            End If

            If Environment.GetCommandLineArgs().Length > 2 Then
                If IsNumeric(Environment.GetCommandLineArgs(2)) Then
                    TimeOut = Environment.GetCommandLineArgs(2)
                End If
            End If

            If Environment.GetCommandLineArgs().Length > 3 Then
                Url = Environment.GetCommandLineArgs(3)
            End If

            Environment.GetCommandLineArgs()
            AttachToProcess(AppName, TimeOut)
            'Console.WriteLine("Attached!!")

            'load site for faster opening later
            Using client = New WebClient()
                Dim contents = client.DownloadString(Url)
            End Using

            'open site in firefox
            Dim ExternalProcess As New System.Diagnostics.Process()
            ExternalProcess.StartInfo.FileName = "c:\Program Files (x86)\Mozilla Firefox\firefox.exe"
            ExternalProcess.StartInfo.WindowStyle = ProcessWindowStyle.Minimized
            ExternalProcess.StartInfo.Arguments = "-url " & Url
            ExternalProcess.Start()
            'ExternalProcess.WaitForExit()

        Catch Ex As Exception
            Console.Write("Unable to Attach to Debugger : " & Ex.Message)
        End Try
    End Sub
End Module