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.
Depois de selecionar o modelo de projeto, você precisa dar um nome ao seu projeto. Chame-o de InsertGuid.
Depois de pressionar o botão Criar , você deve acabar com um projeto VSIX básico com a seguinte aparência:
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.
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:
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 .
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.