Учебник. Отладка кода C# и C++ в рамках одного сеанса отладкиTutorial: Debug C# and C++ in the same debugging session

В рамках одного сеанса отладки в среде Visual Studio можно использовать отладчики разных типов. Такой режим называется смешанным.Visual Studio lets you enable more than one debugger type in a debugging session, which is called mixed-mode debugging. Из этого учебника вы узнаете, как одновременно выполнять отладку управляемого и машинного кода в рамках одного сеанса отладки.In this tutorial, you learn to debug both managed and native code in a single debugging session.

В этом учебнике описывается процесс отладки машинного кода из управляемого приложения. Тем не менее при необходимости вы можете выполнять отладку управляемого кода из собственного приложения.This tutorial shows how to debug native code from a managed app, but you can also debug managed code from a native app. Отладчик также поддерживает смешанные режимы других типов, например отладку кода Python и машинного кода, а также использование отладчика сценариев в приложениях таких типов, как ASP.NET.The debugger also supports other types of mixed-mode debugging, such as debugging Python and native code, and using the script debugger in app types such as ASP.NET.

В этом руководстве рассмотрены следующие задачи:In this tutorial, you will:

  • Создание простой собственной библиотеки DLLCreate a simple native DLL
  • Создание простого приложения .NET Core или .NET Framework для вызова библиотеки DLLCreate a simple .NET Core or .NET Framework app to call the DLL
  • Настройка смешанного режима отладкиConfigure mixed-mode debugging
  • Запуск отладчикаStart the debugger
  • Попадание в точку останова в управляемом приложенииHit a breakpoint in the managed app
  • Шаг с заходом в машинный кодStep into the native code

Предварительные требованияPrerequisites

Необходимо установить среду Visual Studio со следующими рабочими нагрузками.You must have Visual Studio installed, with the following workloads:

  • Разработка классических приложений на C++Desktop development with C++
  • Разработка классических приложений .NET или Кроссплатформенная разработка .NET Core в зависимости от того, приложение какого типа вы создаете.Either .NET desktop development or .NET Core cross platform development, depending on which type of app you want to create.

Если вы еще не установили среду Visual Studio, вы можете сделать это бесплатно со страницы  скачиваемых материалов Visual Studio .If you don't have Visual Studio, go to the Visual Studio downloads page to install it for free.

Если среда Visual Studio уже установлена без необходимых рабочих нагрузок, выберите Открыть Visual Studio Installer в левой области диалогового окна Новый проект Visual Studio.If you have Visual Studio installed, but don't have the workloads you need, select Open Visual Studio Installer in the left pane of the Visual Studio New Project dialog box. В Visual Studio Installer выберите нужную рабочую нагрузку и щелкните Изменить.In the Visual Studio Installer, select the workloads you need, and then select Modify.

Создание простой собственной библиотеки DLLCreate a simple native DLL

Создание файлов для проекта библиотеки DLL:To create the files for the DLL project:

  1. Откройте Visual Studio и создайте проект.Open Visual Studio and create a project.

    Нажмите клавишу ESC, чтобы закрыть окно запуска.Press Esc to close the start window. Нажмите CTRL+Q, чтобы открыть поле поиска, введите пустой проект, выберите Шаблоны и затем Create new Empty Project project (Создание пустого проекта).Type Ctrl + Q to open the search box, type Empty Project, choose Templates, then choose Create new Empty Project project for C++. В появившемся диалоговом окне выберите Создать.In the dialog box that appears, choose Create. Введите имя, например Mixed_Mode_Debugging, и нажмите кнопку Создать.Then, type a name like Mixed_Mode_Debugging and click Create.

    В верхней строке меню выберите Файл > Создать > Проект.From the top menu bar, choose File > New > Project. В левой области диалогового окна Новый проект в разделе Visual C++ выберите Другой, а затем в средней области выберите Пустой проект.In the left pane of the New project dialog box, under Visual C++, choose Other, and then in the middle pane choose Empty Project. Введите имя, например Mixed_Mode_Debugging, и нажмите кнопку ОК.Then, type a name like Mixed_Mode_Debugging and click OK.

    Если шаблон проекта Пустой проект отсутствует, перейдите в меню Средства > Получить средства и компоненты... , после чего запустится Visual Studio Installer.If you don't see the Empty Project project template, go to Tools > Get Tools and Features..., which opens the Visual Studio Installer. Запускается Visual Studio Installer.The Visual Studio Installer launches. Выберите рабочую нагрузку Разработка классических приложений на C++ , а затем нажмите Изменить.Choose the Desktop development with C++ workload, then choose Modify.

    Visual Studio создаст проект.Visual Studio creates the project.

  2. В диалоговом окне Новый проект в разделе Visual C++ выберите Другой и затем щелкните элемент Пустой проект в центральной области.In the New Project dialog box, under Visual C++, select Other, and then select Empty Project in the middle pane.

  3. В поле Имя введите Mixed_Mode_Debugging и затем нажмите кнопку ОК.In the Name field, type Mixed_Mode_Debugging, and then select OK.

    Visual Studio создаст пустой проект и выведет его содержимое в обозревателе решений.Visual Studio creates the empty project and displays it in Solution Explorer.

  4. В обозревателе решений последовательно выберите Исходные файлы, Проект > Добавить новый элемент.In Solution Explorer, select Source Files, and then select Project > Add New Item. Также можно щелкнуть пункт Исходные файлы правой кнопкой мыши и выбрать Добавить > Новый элемент.Or, right-click Source Files and select Add > New Item.

  5. В диалоговом окне Новый элемент выберите Файл C++ (.cpp) .In the New Item dialog, select C++ file (.cpp). Введите Mixed_Mode.cpp в поле Имя, после чего нажмите Добавить.Type Mixed_Mode.cpp in the Name field, and then select Add.

    Visual Studio добавит в обозреватель решений новый файл C++.Visual Studio adds the new C++ file to Solution Explorer.

  6. Скопируйте следующий код в файл Mixed_Mode.cpp.Copy the following code into Mixed_Mode.cpp:

    #include "Mixed_Mode.h"
    
  7. В обозревателе решений последовательно выберите Файлы заголовков, Проект > Добавить новый элемент.In Solution Explorer, select Header Files, and then select Project > Add New Item. Также можно щелкнуть пункт Файлы заголовков правой кнопкой мыши и выбрать Добавить > Новый элемент.Or, right-click Header Files and select Add > New Item.

  8. В диалоговом окне Новый элемент выберите Файл заголовка (.h) .In the New Item dialog, select Header file (.h). Введите Mixed_Mode.h в поле Имя, после чего нажмите Добавить.Type Mixed_Mode.h in the Name field, and then select Add.

    Visual Studio добавит в обозреватель решений новый файл заголовка.Visual Studio adds the new header file to Solution Explorer.

  9. Скопируйте следующий код в файл Mixed_Mode.h.Copy the following code into 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
    
  10. Выберите Файл > Сохранить все или нажмите клавиши CTRL+SHIFT+S для сохранения файлов.Select File > Save All or press Ctrl+Shift+S to save the files.

Настройка и построение проекта библиотеки DLL:To configure and build the DLL project:

  1. в панели инструментов Visual Studio выберите конфигурацию Отладка и платформу x86 или x64.In the Visual Studio toolbar, select Debug configuration and x86 or x64 platform. Если вызовы будут осуществляться из приложения .NET Core, которое всегда выполняется в 64-разрядном режиме, выберите платформу x64.If your calling app will be .NET Core, which always runs in 64-bit mode, select x64 as the platform.

  2. В обозревателе решений выберите узел проекта Mixed_Mode_Debugging, после чего щелкните значок Свойства или щелкните узел проекта правой кнопкой мыши и выберите пункт Свойства.In Solution Explorer, select the Mixed_Mode_Debugging project node and select the Properties icon, or right-click the project node and select Properties.

  3. Убедитесь, что в верхней части области Свойства для параметра Конфигурация установлено значение Активная (отладка) , а для параметра Платформа задано значение, выбранное в панели инструментов (x64 или Win32 для платформы x86).At the top of the Properties pane, make sure the Configuration is set to Active(Debug) and the Platform is the same as what you set in the toolbar: x64, or Win32 for x86 platform.

    Important

    При смене платформы с x86 на x64 или наоборот необходимо повторно настроить свойства для новой платформы.If you switch platform from x86 to x64 or vice versa, you must reconfigure the properties for the new platform.

  4. В левой области раздела Свойства конфигурации выберите Компоновщик > Дополнительно, а затем для элемента Без точки входа в раскрывающемся списке выберите значение Нет.Under Configuration Properties in the left pane, select Linker > Advanced, and in the dropdown next to No Entry Point, select No. Если значение было изменено на Нет, нажмите кнопку Применить.If you had to change it to No, select Apply.

  5. В разделе Свойства конфигурации выберите Общие, а затем для элемента Тип конфигурации в раскрывающемся списке выберите значение Динамическая библиотека (.dll) .Under Configuration Properties, select General, and in the dropdown next to Configuration Type, select Dynamic Library (.dll). Нажмите кнопку Применить, а затем кнопку ОК.Select Apply, and then select OK.

    Переключение к собственной библиотеке DLL

  6. Выберите проект в обозревателе решений, затем выберите Сборка > Построить решение, после чего нажмите клавишу F7 или щелкните проект правой кнопкой мыши и выберите Сборка.Select the project in Solution Explorer and then select Build > Build Solution, press F7, or right-click the project and select Build.

    Проект должен быть построен без ошибок.The project should build with no errors.

Создание простого управляемого приложения для вызова библиотеки DLLCreate a simple managed app to call the DLL

  1. Откройте Visual Studio и создайте новый проект.Open Visual Studio and create a new project.

    Нажмите клавишу ESC, чтобы закрыть окно запуска.Press Esc to close the start window. Нажмите CTRL+Q, чтобы открыть поле поиска, введите консоль, выберите Шаблоны и затем Create new Console App (.NET Framework) project (Создание проекта консольного приложения — .NET Framework) для C#.Type Ctrl + Q to open the search box, type console, choose Templates, and then choose Create new Console App (.NET Framework) project for C#. В появившемся диалоговом окне выберите Создать.In the dialog box that appears, choose Create.

    Введите имя, например Mixed_Mode_Calling_App, и нажмите кнопку Создать.Then, type a name like Mixed_Mode_Calling_App and click Create.

    В верхней строке меню выберите Файл > Создать > Проект.From the top menu bar, choose File > New > Project. В левой области диалогового окна Новый проект в разделе Visual C# выберите Рабочий стол Windows, а затем в средней области выберите Консольное приложение (.NET Framework) или Консольное приложение (.NET Core) .In the left pane of the New project dialog box, under Visual C#, choose Windows Desktop, and then in the middle pane choose Console App (.NET Framework) or Console App (.NET Core).

    Введите имя, например Mixed_Mode_Calling_App, и нажмите кнопку ОК.Then, type a name like Mixed_Mode_Calling_App and click OK.

    Если шаблон проекта Консольное приложение отсутствует, перейдите в меню Сервис > Получить средства и компоненты... , после чего запустится Visual Studio Installer.If you don't see the Console App project template, go to Tools > Get Tools and Features..., which opens the Visual Studio Installer. Выберите рабочую нагрузку .Разработка классических приложений .NET и затем элемент Изменить.Choose the .NET desktop development workload, then choose Modify.

    Note

    При необходимости вы можете добавить в существующее решение C++ новый управляемый проект, однако при создании нового решения вам будет доступно больше сценариев отладки.Although you could also add the new managed project to your existing C++ solution, creating a new solution supports more debugging scenarios.

    Visual Studio создаст пустой проект и выведет его содержимое в обозревателе решений.Visual Studio creates the empty project and displays it in Solution Explorer.

  2. Замените все содержимое файла Program.cs следующим кодом.Replace all the code in Program.cs with the following code:

    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 {0}", result);
                Console.ReadKey();
            }
        }
    }
    
  3. В новом коде замените путь к файлу в поле [DllImport] на путь к созданному файлу Mixed_Mode_Debugging.dll.In the new code, replace the file path in [DllImport] with your file path to the Mixed_Mode_Debugging.dll you just created. См. подсказки в комментариях к коду.See the code comment for hints. Не забудьте заменить заполнитель username.Make sure to replace the username placeholder.

  4. Выберите Файл > Сохранить Program.cs или нажмите клавиши CTRL+S для сохранения файла.Select File > Save Program.cs or press Ctrl+S to save the file.

Настройка смешанного режима отладкиConfigure mixed-mode debugging

Настройка смешанного режима отладки для приложения .NET FrameworkTo configure mixed-mode debugging for a .NET Framework app

  1. В обозревателе решений выберите узел проекта Mixed_Mode_Calling_App, после чего щелкните значок Свойства или щелкните узел проекта правой кнопкой мыши и выберите пункт Свойства.In Solution Explorer, select the Mixed_Mode_Calling_App project node and select the Properties icon, or right-click the project node and select Properties.

  2. В левой области выберите пункт Отладка, установите флажок Включить отладку машинного кода и закройте страницу свойств, чтобы сохранить изменения.Select Debug in the left pane, select the Enable native code debugging check box, and then close the properties page to save the changes.

    Включение смешанного режима отладки

Настройка смешанного режима отладки для приложения .NET CoreTo configure mixed-mode debugging for a .NET Core app

В большинстве версий Visual Studio, начиная с Visual Studio 2017, для включения смешанного режима отладки машинного кода в приложении .NET Core необходимо использовать файл launchSettings.json вместо свойств проекта.In most versions of Visual Studio starting in Visual Studio 2017, you must use the launchSettings.json file instead of the project properties to enable mixed-mode debugging for native code in a .NET Core app. Последние обновления пользовательского интерфейса для этой возможности см. в статье, посвященной этой проблеме GitHub.To track UI updates for this feature, see this GitHub issue.

  1. В обозревателе решений разверните узел Свойства и откройте файл launchSettings.json.In Solution Explorer, expand Properties, and open the launchSettings.json file.

    Note

    По умолчанию файл launchSettings.json находится в каталоге C:\Users\username\source\repos\Mixed_Mode_Calling_App\Properties.By default, launchSettings.json is in C:\Users\username\source\repos\Mixed_Mode_Calling_App\Properties. Если файл launchSettings.json не существует, выберите проект Mixed_Mode_Calling_App в обозревателе решений, а затем щелкните значок Свойства или щелкните узел проекта правой кнопкой мыши и выберите пункт Свойства.If launchSettings.json doesn't exist, select the Mixed_Mode_Calling_App project in Solution Explorer and then select the Properties icon, or right-click the project and select Properties. Внесите временные изменения на вкладке Отладка и выполните построение проекта.Make a temporary change in the Debug tab, and build the project. В результате этого будет создан файл launchSettings.json.This will create a launchSettings.json file. Отмените изменения, выполненные на вкладке Отладка.Revert the change that you made in the Debug tab.

  2. В файл launchsettings.json добавьте следующую строку:In the launchsettings.json file, add the following line:

    "nativeDebugging": true
    

    Готовый файл будет выглядеть следующим образом.The complete file will look like the following example:

    {
      "profiles": {
        "Mixed_Mode_Calling_App": {
          "commandName": "Project",
          "nativeDebugging": true
        }
      }
    }
    

Задание точки останова и запуск отладкиSet a breakpoint and start debugging

  1. В проекте C# откройте файл Program.cs.In the C# project, open Program.cs. Задайте точку останова в следующей строке кода. Для этого щелкните в дальнем левом поле, выберите строку и нажмите клавишу F9 либо щелкните строку правой кнопкой мыши и выберите Точка останова > Вставить точку останова.Set a breakpoint on the following line of code by clicking in the far left margin, selecting the line and pressing F9, or right-clicking the line and selecting Breakpoint > Insert Breakpoint.

    int result = Multiply(7, 7);
    

    В месте установки точки останова в левом поле появится красный круг.A red circle appears in the left margin where you set the breakpoint.

  2. Нажмите клавишу F5 и щелкните зеленую стрелку в панели инструментов Visual Studio либо выберите Отладка > Начать отладку, чтобы запустить отладку.Press F5, select the green arrow in the Visual Studio toolbar, or select Debug > Start Debugging to start debugging.

    Отладчик приостановит выполнение в заданной точке останова.The debugger pauses on the breakpoint that you set. Место, в котором приостановлена работа отладчика, будет указано желтой стрелкой.A yellow arrow indicates where the debugger is currently paused.

Шаг с заходом в машинный код и с выходом из негоStep in and out of native code

  1. Если отладка управляемого приложения приостановлена, нажмите клавишу F11 или выберите Отладка > Шаг с заходом.While debugging is paused in the managed app, press F11, or select Debug > Step Into.

    Откроется собственный файл заголовка Mixed_Mode.h. Место, в котором приостановлена работа отладчика, будет отмечено желтой стрелкой.The Mixed_Mode.h native header file opens, and you see the yellow arrow where the debugger is paused.

    Шаг с заходом в машинный код

  2. Теперь вы можете задавать точки останова и при попадании в них проверять переменные в машинном и управляемом коде.Now, you can set and hit breakpoints and inspect variables in the native or managed code.

    • Чтобы просмотреть значение переменной в исходном коде, наведите на нее указатель мыши.Hover over variables in the source code to see their values.

    • Переменные и их значения можно просматривать в окнах Видимые и Локальные.Look at variable and their values in the Autos and Locals windows.

    • Если отладка приостановлена, вы также можете использовать окна контрольных значений и стека вызовов.While paused in the debugger, you can also use the Watch windows and the Call Stack window.

  3. Чтобы перейти в отладчике на одну строку вперед, нажмите клавишу F11 еще раз.Press F11 again to advance the debugger one line.

  4. Чтобы продолжить выполнение и снова приостановить работу в управляемом приложении, нажмите клавиши SHIFT+F11 или выберите Отладка > Шаг с выходом.Press Shift+F11 or select Debug > Step Out to continue execution and pause again in the managed app.

  5. Чтобы продолжить отладку, нажмите клавишу F5 или щелкните зеленую стрелку.Press F5 or select the green arrow to continue debugging the app.

Поздравляем!Congratulations! Вы полностью ознакомились с учебником, посвященным отладке в смешанном режиме.You have completed the tutorial on mixed-mode debugging.

Дальнейшие действияNext step

Из этого руководства вы узнали, как выполнять отладку машинного кода из управляемого приложения в смешанном режиме.In this tutorial, you learned how to debug native code from a managed app by enabling mixed-mode debugging. Обзор других возможностей отладчика см. в следующих статьях.For an overview of other debugger features, see: