Compartilhar via


Sua primeira extensão do Visual Studio

Este artigo orienta você por algumas etapas simples para colocar sua primeira extensão do Visual Studio em funcionamento. Uma extensão do Visual Studio é escrita usando o .NET Framework e C#. Se você já é um desenvolvedor .NET, descobrirá que escrever extensões é semelhante a escrever a maioria dos outros programas e bibliotecas .NET.

A extensão que você escreverá hoje adiciona um comando que insere um novo guid no editor de texto quando executado. É simples, útil e fornece uma boa introdução aos vários aspectos do desenvolvimento de extensões.

Se você é um aprendiz visual, confira este pequeno vídeo de alguém seguindo o tutorial.

Antes de começar a escrever sua primeira extensão do Visual Studio (é fácil, eu prometo!), verifique se você tem as ferramentas necessárias.

Criar o projeto

Existem vários modelos de projeto para escolher, então você deseja fazer a escolha certa. Os modelos usados neste kit de ferramentas da comunidade, todos têm o apelido (Comunidade) no nome.

O modelo VSIX Project w/Command (Community) vem com um comando conectado, facilitando o início a partir daí. Este é um ótimo ponto de partida para a maioria das extensões. Se você souber que deseja uma janela de ferramenta, use o modelo Projeto VSIX com Janela de Ferramentas (Comunidade). Ele também tem um comando para abrir a janela da ferramenta.

Use os modelos Projeto VSIX vazio (Comunidade) ou Projeto VSIX (Comunidade) para extensões somente MEF ou outros cenários avançados.

Desta vez, você selecionará o modelo VSIX Project w/Command (Community), conforme mostrado na captura de tela abaixo.

New Project Dialog showing VSIX project templates.

Depois de selecionar o modelo de projeto, você precisa dar um nome ao seu projeto. Chame-o de InsertGuid.

Configure your new project.

Depois de pressionar o botão Criar , você deve acabar com um projeto VSIX básico com a seguinte aparência:

New project files and folders.

Arquivos importantes

Vamos analisar os arquivos mais importantes.

InsertGuidPackage.cs é o que é conhecido como a classe Package. Seu InitializeAsync(...) método é chamado pelo Visual Studio para inicializar sua extensão. É a partir daqui que você adiciona ouvintes de eventos e registra comandos, janelas de ferramentas, configurações e outras coisas.

source.extension.vsixmanifest é o arquivo de manifesto para sua extensão. Ele contém metadados, como título e descrição, mas também informações sobre o que a extensão contém.

VSCommandTable.vsct é um arquivo XML onde comandos e associações de chave são definidos declarativamente, para que possam ser registrados com o Visual Studio.

Commands/MyCommand.cs é o manipulador de comandos para o comando definido no arquivo VSCommandTable.vsct . Ele controla o que acontece quando o comando é executado clicando no botão.

Modificando o comando

Primeiro, você deseja verificar se o comando tem o nome, o ícone e a posição corretos no sistema de menus do Visual Studio.

Abra o arquivo VSCommandTable.vsct e localize um e um <Group> <Button>arquivo . Observe como o botão especifica o grupo como sendo seu pai e o pai do grupo é o menu VSMainMenu/Tools interno.

Para sua extensão, você deseja que o botão de comando Inserir GUID esteja no menu principal Editar, portanto, você voltará a colocar o grupo no menu Editar. Substitua Ferramentas por Editar, assim como no trecho a seguir:

<Group guid="InsertGuid" id="MyMenuGroup" priority="0x0600">
  <Parent guid="VSMainMenu" id="Edit"/>
</Group>

Você obtém IntelliSense completo para os posicionamentos para facilitar a localização do local certo.

VSCT parent IntelliSense.

As <Button> necessidades de atualização também. Você dará a ele um novo ícone atualizando o id atributo do <Icon> elemento para PasteAppend. Atualize o texto com um nome bom e descritivo e atualize o com o nome técnico do comando - esse é o <ButtonText> <LocCanonicalName> nome mostrado aos usuários quando eles atribuem atalhos de teclado personalizados ao comando na caixa de diálogo Teclado do Ambiente > de Opções > de Ferramentas>.

<Button guid="InsertGuid" id="MyCommand" priority="0x0100" type="Button">
  <Parent guid="InsertGuid" id="MyMenuGroup" />
  <Icon guid="ImageCatalogGuid" id="PasteAppend" />
  <CommandFlag>IconIsMoniker</CommandFlag>
  <Strings>
    <ButtonText>Insert GUID</ButtonText>
    <LocCanonicalName>.Edit.InsertGuid</LocCanonicalName>
  </Strings>
</Button>

Observação

Sempre inicie o com um caractere <LocCanonicalName> de ponto. Ele garante que nenhum outro texto seja automaticamente pré-anexado e o ponto não será mostrado.

Você pode usar os milhares de ícones disponíveis na biblioteca de imagens do Visual Studio e até mesmo obter uma visualização mostrada no IntelliSense:

VSCT icon IntelliSense.

Agora, você atualizou o nome, o ícone e a localização do nosso comando e é hora de escrever algum código para inserir o guid no editor de texto.

Abra o arquivo /Commands/MyCommand.cs e modifique-o para inserir um novo guid quando executado:

using System;
using Community.VisualStudio.Toolkit;
using EnvDTE;
using Microsoft.VisualStudio.Shell;
using Task = System.Threading.Tasks.Task;

namespace InsertGuid
{
    [Command(PackageIds.MyCommand)]
    internal sealed class MyCommand : BaseCommand<MyCommand>
    {
        protected override async Task ExecuteAsync(OleMenuCmdEventArgs e)
        {
            await Package.JoinableTaskFactory.SwitchToMainThreadAsync();
            DocumentView docView = await VS.Documents.GetActiveDocumentViewAsync();
            if (docView?.TextView == null) return;
            SnapshotPoint position = docView.TextView.Caret.Position.BufferPosition;
            docView.TextBuffer?.Insert(position, Guid.NewGuid().ToString()); 
        }
    }
}

Você está usando o objeto para obter a exibição de texto do editor ativo e, em seguida, inserir o VS guid na posição de cursor do buffer de texto.

Observação

Você verá await JoinableTaskFactory.SwitchToMainThreadAsync() e ThreadHelper.ThrowIfNotOnUIThread() em muitos lugares neste kit de ferramentas da comunidade. Eles lidam com as melhores práticas de troca de threads e você não precisa saber quando e como usá-los neste momento - avisos do compilador com correções de código (lâmpadas) torna isso super fácil.

O primeiro rascunho da nossa extensão já está completo e é hora de testá-lo.

Executar e depurar

Executar sua extensão é tão fácil quanto executar qualquer outro projeto .NET. Basta pressionar F5 para executar com o depurador anexado ou Ctrl+F5 para executar sem.

Isso iniciará a instância experimental do Visual Studio com sua extensão instalada. A instância experimental é sua versão regular do Visual Studio, mas com configurações separadas e extensões instaladas. Ajuda a manter as coisas separadas.

Quando a Instância Experimental for iniciada, você verá o comando Inserir GUID no menu principal Editar .

Insert GUID command located in the Edit main menu.

Abra qualquer arquivo baseado em texto e execute o comando para inserir um novo guid. É isso!

Resumo

Agora você criou sua primeira extensão que adiciona um botão de comando ao menu principal e interage com o editor de texto quando executada.

Parabéns!!

Você pode encontrar o código para essa extensão no repositório de exemplos.