Учебник. Отладка кода C# и C++ в рамках одного сеанса отладки
В рамках одного сеанса отладки в среде Visual Studio можно использовать отладчики разных типов. Такой режим называется смешанным. Из этого учебника вы узнаете, как одновременно выполнять отладку управляемого и машинного кода в рамках одного сеанса отладки.
В этом учебнике описывается процесс отладки машинного кода из управляемого приложения. Тем не менее при необходимости вы можете выполнять отладку управляемого кода из собственного приложения. Отладчик также поддерживает смешанные режимы других типов, например отладку кода Python и машинного кода, а также использование отладчика сценариев в приложениях таких типов, как ASP.NET.
При работе с этим руководством вы сделаете следующее:
- Создание простой собственной библиотеки DLL
- Создание простого приложения .NET Core или .NET Framework для вызова библиотеки DLL
- Настройка смешанного режима отладки
- Запуск отладчика
- Попадание в точку останова в управляемом приложении
- Шаг с заходом в машинный код
Необходимые компоненты
Необходимо установить среду Visual Studio со следующими рабочими нагрузками.
- Разработка классических приложений на C++.
- Разработка классического приложения .NET.
Необходимо установить среду Visual Studio со следующими рабочими нагрузками.
- Разработка классических приложений на C++.
- Разработка классических приложений .NET или Кроссплатформенная разработка .NET Core в зависимости от того, приложение какого типа вы создаете.
Если вы еще не установили среду Visual Studio, вы можете сделать это бесплатно со страницы скачиваемых материалов Visual Studio.
Если среда Visual Studio уже установлена без необходимых рабочих нагрузок, выберите Открыть Visual Studio Installer в левой области диалогового окна Новый проект Visual Studio. В Visual Studio Installer выберите нужную рабочую нагрузку и щелкните Изменить.
Создание простой собственной библиотеки DLL
Создание файлов для проекта библиотеки DLL:
- Откройте Visual Studio и создайте проект. Нажмите клавишу ESC, чтобы закрыть окно запуска. Нажмите CTRL+Q, чтобы открыть поле поиска, введите Пустой проект, выберите Шаблоны и затем Пустой проект в C++. В появившемся диалоговом окне выберите Создать. Введите имя, например Mixed_Mode_Debugging, и нажмите кнопку Создать. Если шаблон проекта Пустой проект отсутствует, перейдите в меню Средства>Получить средства и компоненты. , после чего запустится Visual Studio Installer. Запускается Visual Studio Installer. Выберите рабочую нагрузку Разработка классических приложений на C++, а затем нажмите Изменить. Visual Studio создаст проект.
- В обозревателе решений последовательно выберите Исходные файлы, Проект>Добавить новый элемент. Также можно щелкнуть пункт Исходные файлы правой кнопкой мыши и выбрать Добавить>Новый элемент. Если вы не видите все шаблоны элементов, выберите «Показать все шаблоны«.
- В диалоговом окне Новый элемент выберите Файл C++ (.cpp). Введите Mixed_Mode.cpp в поле Имя, после чего нажмите Добавить. Visual Studio добавит в обозреватель решений новый файл C++.
- Скопируйте следующий код в файл Mixed_Mode.cpp.
#include "Mixed_Mode.h"
#ifndef MIXED_MODE_MULTIPLY_HPP #define MIXED_MODE_MULTIPLY_HPP extern "C" < __declspec(dllexport) int __stdcall mixed_mode_multiply(int a, int b) < return a * b; >> #endif
Настройка и построение проекта библиотеки DLL:
- в панели инструментов Visual Studio выберите конфигурацию Отладка и платформу x86 или x64. Если вызовы будут осуществляться из приложения .NET Core, которое всегда выполняется в 64-разрядном режиме, выберите платформу x64.
- В обозревателе решений выберите узел проекта Mixed_Mode_Debugging, после чего щелкните значок Свойства или щелкните узел проекта правой кнопкой мыши и выберите пункт Свойства.
- Убедитесь, что в верхней части области Свойства для параметра Конфигурация установлено значение Активная (отладка), а для параметра Платформа задано значение, выбранное в панели инструментов (x64 или Win32 для платформы x86).
Важно! При смене платформы с x86 на x64 или наоборот необходимо повторно настроить свойства для новой платформы.

Создание простого управляемого приложения для вызова библиотеки DLL
- Откройте Visual Studio и создайте новый проект. Нажмите клавишу ESC, чтобы закрыть окно запуска. Нажмите клавиши CTRL+Q, чтобы открыть поле поиска, введите консоль, выберите Шаблоны и выберите Консольное приложение для .NET Core или Консольное приложение (.NET Framework) для C#. В открывшемся диалоговом окне щелкните Создать. Затем введите имя, например Mixed_Mode_Calling_App, и щелкните Далее или Создать, в зависимости от того, какой вариант доступен. Для .NET Core выберите рекомендуемую целевую платформу или .NET 8, а затем нажмите кнопку «Создать«. Если нужный шаблон проекта отсутствует, выберите Сервис>Получить средства и компоненты, после чего запустится Visual Studio Installer. Выберите нужную рабочую нагрузку .NET, как описано в предварительных требованиях, и нажмите Изменить.
Примечание. Вы также можете добавить в существующее решение C++ новый управляемый проект. Мы создаем проект в новом решении, чтобы усложнить задачу отладки в смешанном режиме.
using System; using System.Runtime.InteropServices; namespace Mixed_Mode_Calling_App < public class Program < // Replace the file path shown here with the // file path on your computer. For .NET Core, the typical (default) path // for a 64-bit DLL might look like this: // C:\Users\username\source\repos\Mixed_Mode_Debugging\x64\Debug\Mixed_Mode_Debugging.dll // Here, we show a typical path for a DLL targeting the **x86** option. [DllImport(@"C:\Users\username\source\repos\Mixed_Mode_Debugging\Debug\Mixed_Mode_Debugging.dll", EntryPoint = "mixed_mode_multiply", CallingConvention = CallingConvention.StdCall)] public static extern int Multiply(int x, int y); public static void Main(string[] args) < int result = Multiply(7, 7); Console.WriteLine("The answer is ", result); Console.ReadKey(); > > >
Настройка смешанного режима отладки
- В обозревателе решений выберите узел проекта Mixed_Mode_Calling_App, после чего щелкните значок Свойства или щелкните узел проекта правой кнопкой мыши и выберите пункт Свойства.
- Включите отладку машинного кода в свойствах.

На левой панели выберите пункт Отладка, затем Открыть пользовательский интерфейс профилей запуска отладки, после чего установите флажок Включить отладку машинного кода и закройте страницу свойств, чтобы сохранить изменения.

В левой области выберите пункт Отладка, установите флажок Включить отладку машинного кода и закройте страницу свойств, чтобы сохранить изменения.
Задание точки останова и запуск отладки
- В проекте C# откройте файл Program.cs. Задайте точку останова в следующей строке кода. Для этого щелкните в дальнем левом поле, выберите строку и нажмите клавишу F9 либо щелкните строку правой кнопкой мыши и выберите Точка останова>Вставить точку останова.
int result = Multiply(7, 7);
Шаг с заходом в машинный код и с выходом из него
- Если отладка управляемого приложения приостановлена, нажмите клавишу F11 или выберите Отладка>Шаг с заходом. Откроется собственный файл заголовка Mixed_Mode.h. Место, в котором приостановлена работа отладчика, будет отмечено желтой стрелкой.


- Чтобы просмотреть значение переменной в исходном коде, наведите на нее указатель мыши.
- Переменные и их значения можно просматривать в окнах Видимые и Локальные.
- Если отладка приостановлена, вы также можете использовать окна контрольных значений и стека вызовов.
Поздравляем! Вы полностью ознакомились с учебником, посвященным отладке в смешанном режиме.
Следующий шаг
Из этого руководства вы узнали, как выполнять отладку машинного кода из управляемого приложения в смешанном режиме. Обзор других возможностей отладчика см. в следующих статьях.
Отладка из проекта DLL в Visual Studio (C#, C++, Visual Basic, F#)
Одним из способов отладки проекта библиотеки DLL является указание вызывающего приложения в свойствах проекта библиотеки DLL. Затем можно запускать отладку из самого проекта DLL. Чтобы этот метод работал, приложение должно вызвать одну и ту же библиотеку DLL в том расположении, которое вы настроили. Если приложение находит и загружает другую версию библиотеки DLL, эта версия не будет содержать точки останова. Другие методы отладки библиотек DLL см. в разделе Отладка проектов DLL.
Если управляемое приложение вызывает собственную библиотеку DLL или ваше собственное приложение вызывает управляемую библиотеку DLL, можно выполнить отладку библиотеки DLL и вызывающего приложения. Дополнительные сведения см. в разделе Практическое руководство. Отладка в смешанном режиме.
Собственные и управляемые DLL-проекты имеют разные параметры для указания вызывающих приложений.
Указание вызывающего приложения в собственном проекте DLL

- Выберите проект C++ DLL в обозревателе решений. Щелкните значок Свойства, нажмите сочетание клавиш ALT+ВВОД или щелкните проект правой кнопкой мыши и выберите элемент Свойства.
- В диалоговом окне Страницы свойств убедитесь, что в поле Настройка в верхней части окна задано значение Отладка.
- Выберите Свойства конфигурации>Отладка.
- В списке Запускаемый отладчик выберите Локальный отладчик Windows или Удаленный отладчик Windows.
- В поле Команда или Удаленная команда добавьте полный путь и имя файла вызывающего приложения, например EXE-файл.
- Добавьте необходимые аргументы программы в поле Аргументы команды.
- Нажмите ОК.
Указание вызывающего приложения в проекте C# или DLL (.NET Core, .NET 5+)

- Выберите проект C# или Visual Basic DLL в обозревателе решений. Щелкните значок Свойства, нажмите сочетание клавиш ALT+ВВОД или щелкните проект правой кнопкой мыши и выберите элемент Свойства.
- Откройте вкладку «Отладка» и выберите пункт Открыть пользовательский интерфейс профилей запуска отладки.
- В диалоговом окне «Профили запуска» щелкните значок Создать новый профиль и выберите Исполняемый файл.
- В новом профиле в разделе Исполняемый файл перейдите к расположению исполняемого файла (.exe) и выберите его.
- В диалоговом окне «Профили запуска» найдите и запишите имя профиля по умолчанию, а затем выберите его и удалите.
- Присвойте новому профилю имя профиля по умолчанию. Чтобы получить такой же результат, можно также вручную изменить файл launchSettings.json. Необходимо, чтобы первый профиль в файле launchSettings.json соответствовал имени библиотеки классов и он был первым указан в файле.
Указание вызывающего приложения в управляемом проекте DLL
- Выберите проект C# или Visual Basic DLL в обозревателе решений. Щелкните значок Свойства, нажмите сочетание клавиш ALT+ВВОД или щелкните проект правой кнопкой мыши и выберите элемент Свойства.
- Убедитесь, что в поле Настройка в верхней части окна задано значение Отладка.
- В разделе Запустить действие
- Для библиотек DLL .NET Framework выберите Запустить внешнюю программу и добавьте полный путь и имя вызывающего приложения.
- Или выберите Запустить браузер с URL-адресом и введите URL-адрес локального приложения ASP.NET.
- У библиотек DLL .NET Core для Visual Basic страница свойств Отладка отличается. Выберите Исполняемый файл из раскрывающегося списка Запуск, а затем добавьте полный путь и имя вызывающего приложения в поле Исполняемый файл.
- Для библиотек DLL .NET Core страница свойств Отладка отличается. Выберите Исполняемый файл из раскрывающегося списка Запуск, а затем добавьте полный путь и имя вызывающего приложения в поле Исполняемый файл.

Отладка из проекта DLL
- Задайте точки останова в проекте DLL.
- Щелкните проект DLL правой кнопкой мыши и выберите Назначить запускаемым проектом.
- Убедитесь, что в поле Конфигурация решений установлено значение Отладка. Нажмите клавишу F5, щелкните зеленую стрелку Запуск или выберите Отладка>Начать отладку.
- Если отладка не достигает точек останова, убедитесь, что выходные данные библиотеки DLL (по умолчанию — папка \Debug) — это расположение, которое вызывает вызывающее приложение.
- Если вы хотите прервать выполнение кода в управляемом вызывающем приложении из собственной библиотеки DLL или наоборот, включите отладку в смешанном режиме.
- В некоторых сценариях может потребоваться сообщить отладчику, где найти исходный код. Дополнительные сведения см. в разделе Использование страниц «Символы не загружены» или «Нет исходного кода».
Связанный контент
- Отладка проектов DLL
- Параметры проекта для конфигураций отладки C#
- Параметры проекта для конфигурации отладки Visual Basic
- Параметры проекта для конфигурации отладки C++
Исполняемый файл для сеанса отладки — диалоговое окно
Это диалоговое окно появляется при попытке выполнить отладку библиотеки DLL, для которой не указан исполняемый файл. Visual Studio не может запустить библиотеку DLL непосредственно. Вместо этого Visual Studio запускает указанный исполняемый файл. Отладку библиотеки DLL можно выполнить, когда она будет вызвана исполняемым файлом.
Имя исполняемого файла. Введите путь к исполняемому файлу, который вызовет отлаживаемую библиотеку DLL.
URL-адрес, по которому можно получить доступ к проекту (только для ATL-сервера). Если выполняется отладка библиотеки DLL сервера ATL, введите URL-адрес, по которому может быть найден проект.
Определенные параметры хранятся в страницах свойств проекта, поэтому в последующих сеансах отладки повторно задавать их не нужно. Если возникнет необходимость в их изменении, можно открыть окно «Страницы свойств» и задать требуемые значения. Дополнительные сведения об указании исполняемого файла для сеанса отладки см. в разделе Отладка библиотек DLL.
См. также
- Отладка в Visual Studio
- Первое знакомство с отладчиком
Отладка в смешанном режиме (C#, C++, Visual Basic)
Далее описывается процедура включения отладки одновременно для управляемого и машинного кода, так называемой отладки в смешанном режиме. Есть два сценария отладки в смешанном режиме.
- Приложение в машинном коде вызывает библиотека DLL с управляемым кодом.
- Приложение с управляемым кодом вызывает библиотеку DLL в машинном коде. Дополнительные сведения об этом сценарии см. в руководстве по отладке управляемого и машинного кода.
Вы можете включить отладчики управляемого и машинного кода на страницах Свойства для проекта вызывающего приложения. Но параметры для приложений в машинном и управляемом кодах различаются.
Если у вас нет доступа к проекту вызывающего приложения, отладку библиотеки DLL можно выполнить из проекта библиотеки DLL. Если отладка выполняется только для проекта DLL, смешанный режим не требуется. Дополнительные сведения о том, как выполнить отладку из проекта библиотека DLL, см. в этой статье.
Отображаемые диалоговые окна и команды могут отличаться от описанных в этой статье в зависимости от настроек или выпуска Visual Studio. Чтобы изменить настройки, перейдите в раздел Сервис>Импорт и экспорт параметров. Дополнительные сведения см. в разделе «Сброс всех параметров».
Включение отладки в смешанном режиме для вызывающего приложения в машинном коде

- Щелкните правой кнопкой мыши проект C++ в обозревателе решений и щелкните значок Свойства. Нажмите сочетание клавиш ALT+ВВОД или щелкните проект правой кнопкой мыши и выберите элемент Свойства.
- В диалоговом окне Страницы свойств разверните узел Свойства конфигурации и выберите элемент Отладка.
- Установите Тип отладчика в Смешанный или Авто.
- Нажмите ОК.
Включение отладки в смешанном режиме для вызывающего приложения с управляемым кодом
- Щелкните правой кнопкой мыши проект C++ или Visual Basic в обозревателе решений и щелкните значок Свойства. Нажмите сочетание клавиш ALT+ВВОД или щелкните проект правой кнопкой мыши и выберите Свойства.
- В Обозревателе решений выберите узел проекта C# или Visual Basic, после чего щелкните значок Свойства или щелкните узел проекта правой кнопкой мыши и выберите пункт Свойства.
- Включите отладку машинного кода в свойствах.

Для C# на левой панели выберите пункт Отладка, затем Открыть пользовательский интерфейс профилей запуска отладки, после чего установите флажок Включить отладку машинного кода и закройте страницу свойств, чтобы сохранить изменения. Для Visual Basic на левой панели выберите пункт Отладка, установите флажок Включить отладку машинного кода и закройте страницу свойств, чтобы сохранить изменения.

В левой области выберите пункт Отладка, установите флажок Включить отладку машинного кода и закройте страницу свойств, чтобы сохранить изменения.
Примечание. Чтобы включить смешанный режим отладки для приложений .NET Core в Visual Studio 2017 и Visual Studio 2019, необходимо использовать файл launchSettings.json вместо свойств проекта.