Tutorial: Depurar C# y C++ en la misma sesión de depuración
Visual Studio permite habilitar más de un tipo de depurador en una sesión de depuración, que se denomina depuración en modo mixto. En este tutorial, aprenderá a depurar código administrado y nativo en una sola sesión de depuración.
En este tutorial se muestra cómo depurar código nativo desde una aplicación administrada, pero también puede depurar código administrado desde una aplicación nativa. El depurador también admite otros tipos de depuración en modo mixto, como la depuración Python y el código nativo, y el uso del depurador de scripts en tipos de aplicación como ASP.NET.
En este tutorial, hará lo siguiente:
- Creación de un archivo DLL nativo sencillo
- Creación de una aplicación sencilla de .NET Core o .NET Framework para llamar a la DLL
- Configurar la depuración en modo mixto
- Iniciar el depurador
- Alcanzar un punto de ruptura en la aplicación gestionada
- Entrar en el código nativo
Prerrequisitos
Debe tener Visual Studio instalado, con las siguientes cargas de trabajo:
- Desarrollo para el escritorio con C++
- Desarrollo de aplicaciones de escritorio en .NET
Debe tener Visual Studio instalado, con las siguientes cargas de trabajo:
- Desarrollo de escritorios con C++
- desarrollo de escritorio de .NET o desarrollo multiplataforma de .NET Core, dependiendo del tipo de aplicación que quieras crear.
Si no tiene Visual Studio, vaya a la página de descargas de Visual Studio para instalarlo de forma gratuita.
Si tiene Visual Studio instalado, pero no tiene las cargas de trabajo que necesita, seleccione Abrir Instalador de Visual Studio en el panel izquierdo del cuadro de diálogo de Visual Studio Nuevo Proyecto. En el Instalador de Visual Studio, seleccione las cargas de trabajo que necesita y, a continuación, seleccione Modificar.
Creación de un archivo DLL nativo sencillo
Para crear los archivos del proyecto DLL:
Abra Visual Studio y cree un proyecto.
Presione esc para cerrar la ventana de inicio. Escriba Ctrl + Q para abrir el cuadro de búsqueda, escriba Proyecto vacío, elija Plantillasy elija Proyecto vacío para C++. En el cuadro de diálogo que aparece, elija Crear. A continuación, escriba un nombre como Mixed_Mode_Debugging y presione Crear.
Si no ve la plantilla de proyecto Proyecto vacío, vaya a Herramientas>Obtener herramientas y características… y se abrirá el instalador de Visual Studio. Se inicia el instalador de Visual Studio. Seleccione la carga de trabajo Desarrollo para el escritorio con C++ y, luego, elija Modificar.
Visual Studio crea el proyecto.
En Explorador de Soluciones, seleccione Archivos de Origeny, a continuación, seleccione Proyecto>Agregar Nuevo Elemento. O bien, haga clic con el botón derecho en Archivos de origen y seleccione Agregar>Nuevo elemento.
Si no ve todas las plantillas de elemento, elija Mostrar todas las plantillas.
En el cuadro de diálogo Nuevo elemento, seleccione Archivo C++ (.cpp). En el campo Nombre, escriba Mixed_Mode.cpp y seleccione Agregar.
Visual Studio agrega el nuevo archivo de C++ a Explorador de soluciones.
Copie el código siguiente en Mixed_Mode.cpp:
#include "Mixed_Mode.h"
En el Explorador de soluciones, seleccione Archivos de encabezado y luego Proyecto>Agregar nuevo elemento. O bien, haga clic con el botón derecho en Archivos de encabezado y seleccione Agregar>Nuevo elemento.
Si no ve todas las plantillas de elemento, elija Mostrar todas las plantillas.
En el cuadro de diálogo Nuevo elemento, seleccione Archivo de encabezado (.h). En el campo Nombre, escriba Mixed_Mode.h y seleccione Agregar.
Visual Studio agrega el nuevo archivo de encabezado a Explorador de soluciones.
Copie el código siguiente en 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
Seleccione Archivo>Guardar Todo o presione Ctrl+Shift+S para guardar los archivos.
Para configurar y compilar el proyecto DLL:
En la barra de herramientas de Visual Studio, seleccione la opción Depurar y la plataforma x86 o x64. Si la aplicación que realiza la llamada será .NET Core, que siempre se ejecuta en modo de 64 bits, seleccione x64 como plataforma.
En el Explorador de soluciones, seleccione el nodo del proyecto Mixed_Mode_Debugging y el icono Propiedades o haga clic con el botón derecho en el nodo del proyecto y seleccione Propiedades.
En la parte superior del panel Propiedades, asegúrese de que Configuración esté establecido en Activo (Depurar) y Plataforma sea la misma que la establecida en la barra de herramientas: x64 o Win32 para la plataforma x86.
Importante
Si cambia de plataforma de x86 a x64 o viceversa, debe volver a configurar las propiedades de la nueva plataforma.
En Propiedades de Configuración en el panel izquierdo, seleccione Vinculador>Avanzadoy, en la lista desplegable junto a Sin punto de entrada, seleccione No. Si tenía que cambiarlo a No, seleccione Aplicar.
En Propiedades de configuración, seleccione Generaly, en la lista desplegable junto a Tipo de configuración, seleccione Biblioteca dinámica (.dll). Seleccione Aplicar y luego Aceptar.
Seleccione el proyecto en el Explorador de soluciones y luego Compilar>Compilar solución, presione F7, o haga clic con el botón derecho en el proyecto y seleccione Compilar.
El proyecto se debe compilar sin errores.
Creación de una aplicación administrada sencilla para llamar al archivo DLL
Abra Visual Studio y cree un proyecto.
Presione esc para cerrar la ventana de inicio. Presione Ctrl + Q para abrir el cuadro de búsqueda, escriba consola, elija Plantillas y, luego, Aplicación de consola para .NET Core o Aplicación de consola (.NET Framework) para C#. En el cuadro de diálogo que aparece, elija Siguiente.
A continuación, escriba un nombre como Mixed_Mode_Calling_App y haga clic en Siguiente o Crear, independientemente de la opción que esté disponible.
En .NET Core, elija la plataforma de destino recomendada o .NET 8 y, después, elija Crear.
Si no ve la plantilla de proyecto correcta, vaya a Tools>Obtener herramientas y características..., que abre el Instalador de Visual Studio. Elija la carga de trabajo de .NET correcta como se describe en los requisitos previos y, después, elija Modificar.
Nota
También puede agregar el nuevo proyecto administrado a la solución de C++ existente. Estamos creando el proyecto en una nueva solución para que la tarea de depuración en modo mixto sea más difícil.
Visual Studio crea el proyecto vacío y lo muestra en Explorador de soluciones.
Reemplace todo el código de Program.cs por el código siguiente:
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(); } } }
En el nuevo código, reemplace la ruta de acceso de archivo de
[DllImport]
por la ruta de acceso de archivo de Mixed_Mode_Debugging.dll que acaba de crear. Consulte el comentario de código para obtener sugerencias. Asegúrese de reemplazar el marcador de posición username.Seleccione Archivo>Guardar Program.cs o presione Ctrl+S para guardar el archivo.
Configurar la depuración en modo mixto
En el Explorador de soluciones, seleccione el nodo del proyecto Mixed_Mode_Calling_App y el icono Propiedades o haga clic con el botón derecho en el nodo del proyecto y seleccione Propiedades.
Habilite la depuración de código nativo en las propiedades.
Código .NET
Seleccione Depurar en el panel izquierdo, seleccione Abrir la interfaz de perfiles de inicio de depuración, después seleccione la casilla Habilitar depuración de código nativo y cierre la página de propiedades para guardar los cambios.
Código de .NET Framework
En el menú de la izquierda, seleccione Depurar. A continuación, en la sección Motores de depurador, seleccione la propiedad Habilitar depuración de código nativo y cierre la página de propiedades para guardar los cambios.
Seleccione Depurar en el panel izquierdo, active la casilla Habilitar depuración de código nativo y cierre la página de propiedades para guardar los cambios.
Si tiene como destino una DLL x64 de una aplicación de .NET Framework, cambie el destino de plataforma de Cualquier CPU a x64. Para ello, es posible que tenga que seleccionar Configuration Manager en la lista desplegable Plataforma de soluciones de la barra de herramientas de depuración. Después, si no puede cambiar directamente a x64, cree una nueva configuración con x64 como destino.
Establecer un punto de interrupción e iniciar la depuración
En el proyecto de C#, abra Program.cs. Establezca un punto de interrupción en la siguiente línea de código haciendo clic en el margen izquierdo, seleccionando la línea y presionando F9, o haciendo clic con el botón derecho en la línea y seleccionando Punto de interrupción>Insertar punto de interrupción.
int result = Multiply(7, 7);
Aparece un círculo rojo en el margen izquierdo donde se establece el punto de interrupción.
Presione F5, seleccione la flecha verde de la barra de herramientas de Visual Studio o seleccione Depurar>Iniciar depuración para iniciar la depuración.
El depurador se detiene en el punto de interrupción establecido. Una flecha amarilla indica dónde se ha detenido el depurador.
Depurar paso a paso por instrucciones del código nativo
Mientras la depuración está detenida en la aplicación administrada, presione F11, o bien seleccione Depurar>Depurar paso a paso por instrucciones.
Se abre el archivo de encabezado nativo Mixed_Mode.h y se ve la flecha amarilla donde se ha detenido el depurador.
Ahora, puede establecer y alcanzar puntos de interrupción e inspeccionar variables en el código nativo o administrado.
Mantenga el puntero sobre las variables en el código fuente para ver sus valores.
Examine las variables y sus valores en las ventanas Automático y Locales.
Mientras el depurador está detenido, también puede usar las ventanas Inspección y Pila de llamadas.
Presione F11 de nuevo para que el depurador avance una línea.
Presione Mayús+F11 o seleccione Depurar>Paso a paso para salir para seguir ejecutando y volver a detener en la aplicación administrada.
Presione F5 o seleccione la flecha verde para continuar depurando la aplicación.
¡Felicidades! Ha completado el tutorial sobre la depuración en modo mixto.
Paso siguiente
En este tutorial, ha aprendido a depurar código nativo desde una aplicación administrada habilitando la depuración en modo mixto. Para obtener información general sobre otras características del depurador, consulte: