As pessoas que me conhecem sabem da minha devoção ao VS Code. Desde quando comecei a aprender C#, sempre usei este editor como plataforma de desenvolvimento. Pra mim, este seria o jeito mais fácil de eu aprender muito mais do que apenas a sintaxe. Neste post, vamos falar do C# Dev Kit e outras extensões que utilizo para facilitar o desenvolvimento no vscode.
Mas porque utilizar o VS Code?
IDE – integrated development environment – são muito importantes para produtividade. Elas conseguem abstrair muitas funcionalidades e configurações “ocultas” da linguagem e do SDK – software development kit. Como já era um desenvolvedor experiente, sabia que aprender a sintaxe da linguagem seria apenas um detalhe. E parte dos meus planos sempre foi me tornar um especialista. Por isso, acabei por deixar a IDE de lado e utilizar o SDK na linha de comando MESMO, fazendo todas as configurações manualmente.
E pra minha surpresa, foi muito fácil!
Sendo sincero, as vezes mais fácil do que na IDE. Outra vantagem também é que, quando precisei escrever pipelines de deploy automático, foi muito simples, uma vez que eu já sabia como utilizar o SDK via linha de comando, e manipulava os arquivos de configuração manualmente. E esta é mais uma vantagem do VS Code: Ele não deixa os arquivos de projeto (e demais arquivos DO projeto) ocultos ou acessíveis apenas através de práticas místicas. Está tudo ali, no formato texto, pronto pra você aprender e manipular.
Outra vantagem é que o terminal está a uma tecla de atalho de distância! E usar o teclado é sempre mais rápido que o mouse – sim, eu sou psico por tempo! Ainda que existam as teclas de atalho, pra mim ainda é mais satisfatório digitar dotnet build
e ver o código sendo buildado na minha frente. E melhor ainda: Os warnings não ficam ocultos em uma aba: estão todos gritando na tela (prontinhos para serem localizados e removidos).
A última vantagem é que, mesmo agora que estou arquiteto, utilizo muito o vscode. Ele me permite, em uma única ferramenta, ter várias outras. Desde o suporte a várias linguagens de desenvolvimento, até mesmo ser capaz de renderizar diagramas de arquitetura, executar notebooks quando necessário, verificar recursos de nuvem, manipular o docker, ter um ótimo visualizador de git… A lista não acaba.
C# Dev Kit

Muito recentemente a Microsoft lançou uma extensão oficial para o desenvolvimento de C# no VS Code: O C# Dev Kit. É preciso dizer que, antes desse dev kit, já era possível desenvolver C# no VS Code. Essa funcionalidade era garantida pela extensão “C#“, que também está presente nesse kit. A diferença é que, por padrão, esta extensão utilizava o OmniSharp como servidor de linguagem. Nesta versão, o Language Server Protocol passou a ser uma versão específica do .Net Runtime voltada para o VSCode.
Essa mudança, por si só, pode trazer muitas melhorias para a experiência de quem utiliza o VSCode para desenvolvimento. O projeto OmniSharp, certamente, sempre entregou muita qualidade. No entanto, sempre que havia mudanças profundas na linguagem, o OmniSharp apresentava bugs por alguns dias (ou semanas). O que é natural de uma aplicação OpenSource. Pelo menos espero que o uso de um LSP próprio da Microsoft diminua essas ocorrências
O que o C# Dev Kit faz?
A integração com essa nova LSP traz algumas novidades “de caixinha”. O refactoring, por exemplo, agora é totalmente integrado com o Roslyn e o Razor, tornando a experiência mais fluída e rápida. Outra novidade que projeto bastante é o Solution Explorer, que agora também está presente no VS Code. Por enquanto, não está fazendo nada demais. Mas a expectativa está grande.
O que eu não achei muito positivo é que alguns snippets pra crianção de classes, enuns, records e etc, só estão disponíveis no Solution Explorer. Eu, como usuário do vs code, estou mais habituado a ter esses atalhos na visão dos arquivos. Inclusive prefiro que estejam por lá. Também percebi algumas falhas. Por motivos que desconheço, o LSP não identificou este arquivo como uma classe válida. E portanto, funcionalidades como o Peek não funcionam corretamente. Acredito que outras extensões também podem ser afetadas com isso.


mostrando que o LSP foi capaz de identificar as dependências corretamente.
Editor config

O compilador Roslyn possui suporte aos arquivos .editorconfig, sendo possível exigir que certos padrões de codificação sejam seguidos. A extensão EditorConfig for VS Code permite que o próprio VS Code utilize algumas propriedades para configurar a formatação do documento. É uma extensão que vai ser muito útil não apenas para C#, mas para outras linguagens também.

E caso você não possua um arquivo .editorconfig
no seu projeto, essa extensão adiciona um, seguindo os padrões de codificação da Microsoft.
C# Format Using

A C# Format Usings é uma extensão bastante satisfatória, já que, além de ordenar alfabeticamente os seus using
, ela também exclui aqueles que não estão sendo utilizados naquela unidade.
Coverage Gutters

Eu amo testes! E isso faz com que essa extensão tenha um lugar especial no meu coração. Contudo, para que ela funcione apropriadamente, você precisa fazer algumas coisinhas:
A primeira delas é que você precisa adicionar o pacote coverlet.msbuild para que, ao executar os testes, seja possível extrair os dados de coverage. Do contrário, não será possível.
A segunda é adicionar alguns parâmetros na execução dos seus testes, para gerar arquivos no padrão “cobertura”.
dotnet test /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura
Quando rodar os testes, verifique se a extensão está ativa, mostrando a cobertura:

Para saber mais sobre testes de unidade e relatórios de cobertura, você pode conferir o artigo Como gerar relatórios de code coverage para código C#.
Nuget Package Manager GUI

Particularmente ainda prefiro o site da nuget.org ao invés de extensões. Mas como eu sei que tem gente que é apegada a GUI – Graphic User Interface – recomendo a Nuget Package Manager GUI como uma boa experiência para instalação e manutenção de bibliotecas. Mas ainda prefiro a dotnet-outdated-tool para manutenção de libs.
ResX Editor

Minha última dica é a extensão ResX editor, que permite você editar, visualmente, os arquivos de recurso do seu projeto.
Minhas impressões sobre o C# Dev Kit
Inteligência artificial
O auto complete está muito mais poderoso. Quando você começa a escrever um código, as sugestões são bastante inteligentes, não se limitando a sugerir métodos de uma classe, mas também implementações de métodos. Com um tab, códigos simples podem ser implementados.


Problemas ao carregar dependências
Identifiquei que ainda há uma dificuldade em identificar dependências. Especialmente quando são internas, mesmo com a configuração de diretório. E isso é muito irritante! As interfaces, classes e etc ficam aparecendo com aquelas indicações de erro e os using aparecem como não-utilizados.
Criar classes, interfaces e enums
Como dito, só é possível criar através dos atalhos do Solution Explorer. Mas para minha surpresa, esse assistente não é capaz de criar o namespace de acordo com a pasta em que a classe foi criada. E tá faltando ali uma linha em branco entre a definição da classe e do namespace. Contudo, pelo menos, o namespace já está seguindo o novo padrão.

E o C# Dev Kit é bom?
A nova LSP com certeza é muito inteligente e vai ajudar bastante as pessoas dev a ganharem algum tempo. Contudo, ela peca no básico – como o caso dos internals que referenciei. O fato, no entanto, é que essa tende a se tornar a experiência padrão para C# no VS Code. Precisamos nos adaptar. Enquanto isso, aquelas pessoas que cuidam da visibilidade de suas classes, podem simplesmente voltar a usar o OmniSharp como LSP. Basta adicionar essa linha ao final do arquivo de configurações do vscode:
"dotnet.server.useOmnisharp": true
Só não se esqueça de testar as novidades de vez em quando. Tenho certeza que o amadurecimento dessa ferramenta será bastante rápido!
Hoje é 30/07/2023. Em um mês eu volto aqui para atualizar esse post!
Boa tarde,
Caro amigo, estou com um problema bastante sério no envio dos eventos do esocial. Não sou especialista em C# mas fiz um script que funciona desde que o esocial foi implantado. Agora eles mudaram o protocolo de segurança para tlsv1.2 e não consigo mais enviar nada. Não há comunicação. Meu Windows usa o tls1.2 e as cifras estão atualizadas. Certificado digital em dia. Se se interessar pelo desafio posso enviar o script e todas as informações que precisar.
Grato desde já
Olá, Antônio! Tudo bem com você?
O desafio parece bastante interessante. Mas temo que infelizmente vou ter que recusá-lo. Fui promovido ao cargo de pai nos últimos meses (por isso que diminuiu bastante a frequência de posts no blog), o que está me levando a reduzir os trabalhos paralelos. Te desejo boa sorte com a solução do seu problema!
E quando conseguir resolver, gostaria muito de saber a sua solução. Se você tiver postado em algum lugar, sinta-se livre pra divulgar aqui 🙂
Abraço!