Generación de código fuente a partir de ensamblados .NET durante la depuración

Al depurar una aplicación .NET, es posible que quiera ver el código fuente que no tiene. Por ejemplo, la interrupción de una excepción o el uso de la pila de llamadas para navegar a una ubicación de origen.

Nota

  • La generación de código fuente (descompilación) solo está disponible para aplicaciones de .NET y se basa en el proyecto de código abierto ILSpy.
  • La descompilación solo está disponible en Visual Studio 2019 16.5 y versiones posteriores.
  • La aplicación del atributo SuppressIldasmAttribute a un ensamblado o un módulo impide que Visual Studio intente descompilar. Aunque el atributo está obsoleto en .NET 6 y versiones posteriores, Visual Studio respeta el atributo.

Generación de código fuente

Cuando está depurando y no hay código fuente disponible, Visual Studio muestra el documento Código fuente no encontrado o, si no tiene símbolos para el ensamblado, el documento No se cargaron símbolos. Ambos documentos tienen una opción para descompilar código fuente que genera código de C# para la ubicación actual. El código de C# generado se puede usar como cualquier otro código fuente. Puede ver el código, inspeccionar las variables, establecer puntos de interrupción, etc.

No se cargaron símbolos

En la ilustración siguiente se muestra el mensaje No se cargaron símbolos.

Screenshot of no symbol loaded document

Código fuente no encontrado

En la ilustración siguiente se muestra el mensaje Código fuente no encontrado.

Screenshot of source not found document

Código de descompilación automática

A partir de la versión 17.7 de Visual Studio 2022, el depurador de Visual Studio admite la descompilación automática del código .NET externo. Puede descompilar automáticamente al entrar en código externo o al usar la ventana Pila de llamadas.

Si entra en código que se ha implementado externamente, el depurador lo descompilará automáticamente y mostrará el punto de ejecución actual. Si desea entrar en el código externo, Solo mi código debe estar deshabilitado.

Puede descompilar fácilmente desde la ventana Pila de llamadas sin deshabilitar Solo mi código.

Para descompilar automáticamente desde la ventana Pila de llamadas:

  1. Al depurar con la ventana Pila de llamadas abierta, seleccione Mostrar código externo.

  2. En la ventana Pila de llamadas, haga doble clic en cualquier marco de pila. El depurador descompila el código y, a continuación, accede directamente al punto de ejecución actual.

    Screenshot of Call Stack window showing external code.

    Todo el código descompilado también se muestra en el nodo Orígenes externos en Explorador de soluciones, lo que facilita la exploración de los archivos externos si es necesario.

    Screenshot of External Sources node showing decompiled assemblies.

    Puede depurar el código descompilado y establecer puntos de interrupción.

Para deshabilitar la descompilación automática de código externo, vaya a Herramientas > Opciones > Depuración > General y anule la selección de Descompilar automáticamente en el origen cuando sea necesario (solo administrado).

Generación e inserción de códigos fuente para un ensamblado

Además de generar código fuente para una ubicación específica, puede generar todo el código fuente de un ensamblado de .NET determinado. Para llevar a cabo esta tarea, vaya a la ventana Módulos y, en el menú contextual de un ensamblado de .NET, seleccione el comando Decompile Source to Symbol File (Descompilar código fuente en archivo de símbolos). Visual Studio genera un archivo de símbolos para el ensamblado y, a continuación, inserta el origen en el archivo de símbolos. En un paso posterior, puede extraer el código fuente insertado.

Screenshot of assembly context menu in modules window with decompile source command.

Extracción y visualización del código fuente insertado

Puede extraer los archivos de código fuente que están insertados en un archivo de símbolos mediante el comando Extract Source Code (Extraer código fuente) en el menú contextual de la ventana Módulos.

Screenshot of assembly context menu in modules window with extract sources command.

Los archivos de origen extraídos se agregan a la solución como archivos varios. La característica de archivos varios está desactivada de forma predeterminada en Visual Studio. Puede habilitar esta casilla con la casilla Herramientas>Opciones>Entorno>Documentos>Mostrar archivos varios en el Explorador de soluciones. Si esta característica no está habilitada, no podrá abrir el código fuente extraído.

Screenshot of tools option page with miscellaneous files option enabled.

Los archivos de código fuente extraídos aparecen en los archivos varios del Explorador de soluciones.

Screenshot of solution explorer with miscellaneous files.

En el caso de las bibliotecas de .NET o para los paquetes de NuGet habilitados para SourceLink, también puede depurar paso a paso por instrucciones el código fuente, establecer puntos de interrupción y usar todas las características del depurador. Para obtener más información, consulte Habilitar la depuración y el diagnóstico con Source Link y Mejorar la productividad en tiempo de depuración con SourceLink.

Restricciones conocidas

Requisito del modo de interrupción

La generación de código fuente mediante la descompilación solo es posible cuando el depurador está en modo de interrupción y la aplicación está en pausa. Por ejemplo, Visual Studio entra en modo de interrupción cuando alcanza un punto de interrupción o una excepción. Puede desencadenar fácilmente Visual Studio para que ejecute la interrupción la próxima vez que se ejecute el código mediante el comando Interrumpir todo (Break all icon).

Limitaciones de descompilación

La generación de código fuente a partir del formato intermedio (IL) que se usa en los ensamblados .NET tiene algunas limitaciones inherentes. Como tal, el código fuente generado no se parece al código fuente original. La mayoría de las diferencias radican en los lugares en los que la información del código fuente original no es necesaria en el entorno de ejecución. Por ejemplo, la información como el espacio en blanco, los comentarios y los nombres de las variables locales no son necesarias en el entorno de ejecución. Se recomienda usar el código fuente generado para entender cómo se ejecuta el programa y no como sustituto del código fuente original.

Depuración de ensamblados optimizados o de versión

Al depurar el código descompilado de un ensamblado que se compiló mediante las optimizaciones del compilador, es posible que se produzcan los siguientes problemas:

  • Es posible que los puntos de interrupción no siempre se enlacen a la ubicación de origen coincidente.
  • Es posible que la ejecución paso a paso no siempre vaya a la ubicación correcta.
  • Es posible que las variables locales no tengan nombres precisos.
  • Es posible que algunas variables no estén disponibles para su evaluación.

Se puede encontrar más información en el problema de GitHub: Integración de ICSharpCode.Decompiler en el depurador de VS.

Confiabilidad de la descompilación

Un porcentaje relativamente pequeño de intentos de descompilación puede dar lugar a errores. Este comportamiento se debe a un error de referencia nula de punto de secuencia en ILSpy. Hemos mitigado el error detectando estos problemas y degradando correctamente el intento de descompilación.

Se puede encontrar más información en el problema de GitHub: Integración de ICSharpCode.Decompiler en el depurador de VS.

Limitaciones del código asincrónico

Los resultados de la descompilación de módulos con patrones de código async/await pueden estar incompletos o no funcionar correctamente. La implementación de ILSpy de máquinas de estado de async/await y solo se implementa parcialmente.

Se puede encontrar más información en el problema de GitHub: Estado del generador de PDB.

Solo mi código

La configuración de Solo mi código permite que Visual Studio depure paso a paso por instrucciones el sistema, el marco, la biblioteca y otras llamadas que no son de usuario. Durante una sesión de depuración, la ventana Módulos muestra los módulos de código que el depurador trata como mi código (código de usuario).

La descompilación de módulos optimizados o de versión genera código que no es de usuario. Si el depurador interrumpe el código descompilado que no es de usuario, por ejemplo, aparecerá la ventana No hay origen. Para deshabilitar Solo mi código, vaya a Herramientas>Opciones (o Depurar>Opciones) >Depuración>General y, a continuación, anule la selección de Habilitar Solo mi código.

Códigos fuente extraídos

El código fuente extraído de un ensamblado tiene las siguientes limitaciones:

  • El nombre y la ubicación de los archivos generados no son configurables.
  • Los archivos son temporales y Visual Studio los elimina.
  • Los archivos se colocan en una sola carpeta y no se utiliza ninguna jerarquía de carpetas que tenían los códigos fuente originales.
  • El nombre de archivo de cada archivo contiene un hash de suma de comprobación del archivo.

El código generado es solo de C#.

La descompilación solo genera archivos de código fuente en C#. No hay ninguna opción para generar archivos en ningún otro lenguaje.