it-roy-ru.com

Как отладить библиотеку классов, которая вызывается из внешнего приложения?

Существует внешний рабочий процесс, который выполняет сценарии C # и может работать с файлами DLL (моя библиотека классов).

Можно ли прикрепить отладку к моему проекту библиотеки классов, чтобы точка останова достигла точки, когда это WF вызовет ее?

Спасибо

23
Sergejs

Да, вы можете сделать это с помощью Visual Studio. У вас есть два варианта:

Настройте свой проект для запуска внешней программы

  1. Откройте свой DLL проект.

  2. В свойствах проекта перейдите на вкладку Debug .

  3. Выберите Запустить внешнюю программу и укажите путь к внешней программе, которая будет вызывать вашу DLL, вместе с любыми аргументами командной строки, которые вам могут потребоваться, и рабочим каталогом, если это уместно.

  4. Сохраните проект.

  5. Установите точки останова в своем коде, где вы хотите их.

  6. Нажмите F5, чтобы начать отладку. (На этом этапе ваши контрольные точки скажут, что они не будут ударены, потому что символы не загружены. Пока не беспокойтесь об этом.)

  7. Делайте все, что вы делаете, чтобы внешнее приложение загружало вашу библиотеку и запускало ваш код.

Visual Studio определит загрузку модуля, загрузит символы и остановится на точке останова.

Присоединить к существующему процессу

Если вы не можете запустить процесс, но вместо этого должны подключиться к процессу, который уже запущен, вы можете сделать это тоже:

(Примечание: если вы используете «Express» версию Visual Studio, я не думаю у нее есть эта функция, но я не уверен в этом. Достаточно легко сказать: вы либо у вас будет пункт меню, упомянутый на шаге 4 ниже, либо нет.)

  1. Убедитесь, что процесс запущен.

  2. Откройте свой DLL проект.

  3. Установите точки останова и т.д.

  4. В меню Отладка выберите Присоединить к процессу ...

  5. В появившемся диалоговом окне найдите процесс в списке, выделите его и нажмите Прикрепить .

  6. Visual Studio перейдет в режим отладки. (На этом этапе ваши контрольные точки скажут, что они не будут ударены, потому что символы не загружены. Пока не беспокойтесь об этом.)

  7. Делайте все, что вы делаете, чтобы внешний процесс загружался и запускал ваш код.

Visual Studio обнаружит загрузку модуля во внешнем процессе, загрузит ваши символы и остановится на вашей точке останова.


Н.Б. В обоих случаях, если внешний процесс загружает вашу DLL откуда-то, кроме папки bin/Debug вашего проекта, вы должны обязательно копировать DLL в это другое местоположение каждый раз, когда вы собираете это (вы можете настроить, чтобы это происходило автоматически в настройках проекта). В противном случае Visual Studio не сможет обнаружить, что загружаемая DLL - это та, которую вы пытаетесь отладить.

25
T.J. Crowder

Вы можете использовать Присоединить к процессу из меню Отладка для отладки вашего проекта DLL. Вам может потребоваться использовать отладку в смешанном режиме, если отладка не происходит с собственным кодом. Это можно сделать, выбрав тип кода Managed и Native в окне, которое появляется при нажатии кнопки Select в окне Attach to process.

Если используемая редакция Visual Studio поддерживает макросы, вы можете создать новый макрос со следующим кодом для автоматизации всего этого:

Imports System
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports EnvDTE90a
Imports EnvDTE100
Imports System.Diagnostics

Public Module AttachToProcess

    Public Sub DebugMyDLL()
        DTE.ExecuteCommand("Build.BuildSelection")
        Dim ApplicationExePath As String = "C:\Program Files (x86)\foo\bar.exe"
        Shell(ApplicationExePath)
        Try
            Dim dbg2 As EnvDTE80.Debugger2 = DTE.Debugger
            Dim trans As EnvDTE80.Transport = dbg2.Transports.Item("Default")
            Dim dbgeng(2) As EnvDTE80.Engine
            dbgeng(0) = trans.Engines.Item("Managed (v4.0)")
            dbgeng(1) = trans.Engines.Item("Native")
            Dim proc2 As EnvDTE80.Process2 = dbg2.GetProcesses(trans, "<QualifierName>").Item("bar.exe")
            proc2.Attach2(dbgeng)
        Catch ex As System.Exception
            MsgBox(ex.Message)
        End Try
    End Sub

End Module

Приведенный выше макрос пытается построить ваш проект, запускает внешнее приложение и затем автоматически присоединяет вашу DLL к этой программе. Вы можете получить QualifierName для вашей системы в окне Присоединить к процессу. Кроме того, версия управляемого кода (в данном случае «Managed (v4.0)») зависит от версии .NET Framework, которую вы используете.

2
Manas Jog

Если вы не хотите/не можете использовать внешнее приложение - вы можете вызвать библиотеку классов напрямую из Visual Studio: Ctrl+Alt+I, чтобы показать "Immediate" вдову, затем вы можете вызвать любой метод из вашей библиотеки классов оттуда (использовать точки останова). Вам придется вводить полностью определенные имена (то есть пространства имен).

1
alexkovelsky

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

0
rock_walker