Подтвердить что ты не робот

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

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

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

Спасибо

4b9b3361

Ответ 1

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

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

  • Откройте проект DLL.

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

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

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

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

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

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

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

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

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

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

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

  • Откройте проект DLL.

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

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

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

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

  • Сделайте все, что вы делаете, чтобы загрузить внешний процесс и запустить свой код.

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


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

Ответ 2

Вы можете использовать Прикрепить к процессу из меню Отладка для отладки вашего проекта DLL. Возможно, вам потребуется использовать отладку смешанного режима, если отладка не выполняется с помощью собственного кода. Это можно сделать, выбрав Managed и Native code type из окна, которое появляется, когда вы нажимаете кнопку 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 для вашей системы из окна Attach to process. Кроме того, версия управляемого кода ( "Управляемый (v4.0)" в этом случае) зависит от используемой версии .NET framework.

Ответ 3

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