Gerar código-fonte de assemblies .NET durante a depuração
Ao depurar uma aplicativo .NET, você pode encontrar uma situação em que deseja exibir um código-fonte que não possui. Por exemplo, interrompendo uma exceção ou usando a pilha de chamadas para navegar até um local de origem.
Nota
- A geração de código-fonte (descompilação) só está disponível para aplicativos .NET e se baseia no projeto ILSpy de código aberto.
- A descompilação só está disponível no Visual Studio 2019 16.5 e posterior.
- A aplicação do atributo SuppressIldasmAttribute a um assembly ou módulo impede que o Visual Studio tente a descompilação. Embora o atributo esteja obsoleto no .NET 6 e posterior, o Visual Studio respeita o atributo.
Gerar código-fonte
Quando você está depurando e nenhum código-fonte está disponível, o Visual Studio mostra o documento Origem Não Encontrada ou, se você não tiver símbolos para o assembly, o documento Nenhum Símbolo Carregado. Ambos os documentos têm uma opção Descompilar código-fonte que gera código C# para o local atual. Em seguida, o código C# gerado pode ser usado como qualquer outro código-fonte. Você pode exibir o código, inspecionar variáveis, definir pontos de interrupção e assim por diante.
Nenhum símbolo carregado
A ilustração a seguir mostra a mensagem Nenhum Símbolo Carregado.
Origem não encontrada
A ilustração a seguir mostra a mensagem Origem Não Encontrada.
Código de autodecompilação
A partir do Visual Studio 2022 versão 17.7, o Depurador do Visual Studio oferece suporte à autodecompilação de código .NET externo. Você pode descompilar automaticamente quando intervir no código externo ou quando usar a janela Pilha de Chamadas.
Se você entrar em um código que foi implementado externamente, o depurador de código o decompila automaticamente e exibe o ponto atual de execução. Se você quiser entrar no código externo, desabilite Just My Code.
Você pode descompilar da janela Pilha de Chamadas sem desabilitar Just My Code.
Para descompilar automaticamente da janela Pilha de Chamadas:
Durante a depuração com a janela Pilha de Chamadas aberta, selecione Mostrar Código Externo.
Na janela Pilha de Chamadas, clique duas vezes em qualquer quadro de pilha. O depurador descompila o código e, em seguida, navega diretamente para o ponto de execução atual.
Todo o código descompilado também é mostrado no nó Fontes Externas no Gerenciador de Soluções, facilitando a navegação pelos arquivos externos, se necessário.
Você pode depurar o código descompilado e definir pontos de interrupção.
Para desabilitar a descompilação automática do código externo, vá para Ferramentas > Opções > Depuração > Geral e desmarque Descompilar automaticamente para a origem quando necessário (somente gerenciado).
Gerar e inserir fontes para uma assemblagem
Além de gerar o código-fonte para um local específico, você pode gerar todo o código-fonte para um determinado assembly .NET. Para realizar essa tarefa, acesse a janela Módulos e, no menu de contexto de um assembly .NET, selecione o comando Descompilar Origem para Arquivo de Símbolo. O Visual Studio gera um arquivo de símbolo para o assembly e insere o código-fonte no arquivo de símbolo. Em uma etapa posterior, você pode extrair o código-fonte inserido.
Extrair e exibir o código-fonte inserido
Você pode extrair arquivos de origem inseridos em um arquivo de símbolo usando o comando Extrair Código-Fonte no menu de contexto da janela Módulos.
Os arquivos de origem extraídos são adicionados à solução como arquivos diversos. O recurso de arquivos diversos está desativado por padrão no Visual Studio. Você pode habilitar esse recurso na caixa de seleção Ferramentas>Opções>Ambiente>Documentos>Mostrar arquivos diversos no Gerenciador de Soluções. Se esse recurso não estiver habilitado, você não poderá abrir o código-fonte extraído.
Os arquivos de origem extraídos aparecem nos arquivos diversos em Gerenciador de Soluções.
SourceLink
Para bibliotecas .NET ou para pacotes NuGet habilitados para SourceLink, você também pode entrar no código-fonte, definir pontos de interrupção e usar todos os recursos do depurador. Para obter mais informações, confira Habilitar depuração e diagnóstico com o Link de Origem e Melhorar a produtividade em tempo de depuração com o SourceLink.
Limitações conhecidas
Requer o modo de interrupção
A geração de código-fonte usando a descompilação só é possível quando o depurador está no modo de interrupção e o aplicativo é pausado. Por exemplo, o Visual Studio entra no modo de interrupção quando atinge um ponto de interrupção ou uma exceção. Você pode disparar facilmente o Visual Studio para interromper na próxima vez que o código for executado usando o comando Interromper Tudo ().
Limitações de descompilação
Gerar código-fonte do IL (formato intermediário) usado em assemblies .NET tem algumas limitações inerentes. Dessa forma, o código-fonte gerado não se parece com o código-fonte original. A maioria das diferenças está em locais em que as informações no código-fonte original não são necessárias em runtime. Por exemplo, informações como espaço em branco, comentários e nomes de variáveis locais não são necessárias no runtime. Recomendamos que você use a fonte gerada para entender como o programa está sendo executado e não como um substituto para o código-fonte original.
Depurar assemblies otimizados ou da versão
Ao depurar o código descompilado de um assembly compilado usando otimizações do compilador, você pode encontrar os seguintes problemas:
- Os pontos de interrupção podem nem sempre ser vinculados à localização de origem correspondente.
- O passo a passo pode nem sempre ir para o local correto.
- As variáveis locais podem não ter nomes precisos.
- Algumas variáveis podem não estar disponíveis para avaliação.
Mais detalhes podem ser encontrados na issue do GitHub: integração do ICSharpCode.Decompiler no VS Debugger.
Confiabilidade de descompilação
Uma porcentagem relativamente pequena de tentativas de descompilação pode resultar em falha. Esse comportamento ocorre devido a um erro de referência nula de ponto de sequência no ILSpy. Atenuamos a falha capturando esses problemas e falhando na tentativa de descompilação.
Mais detalhes podem ser encontrados no problema do GitHub: integração do ICSharpCode.Decompiler ao Depurador VS.
Limitações com código assíncrono
Os resultados da descompilação de módulos com padrões de código assíncrono/await podem estar incompletos ou falhar totalmente. A implementação do ILSpy de máquinas de estado assíncronas/await e de rendimento é implementada apenas parcialmente.
Mais detalhes podem ser encontrados no problema do GitHub: Status do Gerador PDB.
Apenas meu código
A configuração Apenas Meu Código (JMC) permite que o Visual Studio faça o passo a passo do sistema, estrutura, biblioteca e outras chamadas de não usuários. Durante uma sessão de depuração, a janela módulos mostra quais módulos de código o depurador está tratando como Meu Código (código do usuário).
A descompilação de módulos otimizados ou de versão produz código não utilizável. Se o depurador interromper o código não-usuário. descompilado, por exemplo, aparecerá a janela Sem Origem. Para desabilitar Apenas Meu Código, navegue até Ferramentas>Opções (ou Depurar>Opções) >Depurando>Geral e desmarque Habilitar Apenas Meu Código.
Fontes extraídas
O código-fonte extraído de um assembly tem as seguintes limitações:
- O nome e o local dos arquivos gerados não são configuráveis.
- Os arquivos são temporários e excluídos pelo Visual Studio.
- Os arquivos são colocados em uma única pasta e qualquer hierarquia de pastas que as fontes originais tinham não é usada.
- O nome do arquivo para cada arquivo contém um hash de soma de verificação do arquivo.
O código gerado é somente C#
A descompilação gera apenas arquivos de código-fonte em C#. Não há uma opção para gerar arquivos em qualquer outro idioma.