Visual Studio 2013

Expandir o Visual Studio 2013 com Extensões

Doug Erickson
Susan Norwood

Um dos melhores recursos nas versões de nível superior do Visual Studio está agora disponível para todos gratuitamente através do Visual Studio Community 2013 IDE: a capacidade de usar extensões do Visual Studio Gallery (localize as extensões em bit.ly/115mBzm). Então, o que são as extensões? Elas são plugins que permitem estender o Visual Studio Community 2013 (que você pode baixar em bit.ly/1tH2uyc) e recursos do Visual Studio para executar novas tarefas, adicionar novos recursos e refatorar código - ou até mesmo suportar novas linguagens.

A comunidadedos desenvolvedores da Microsoft fornece uma ampla variedade de extensões no Visual Studio Gallery. Dê uma olhada e você ficará surpreso com os tipos de extensões disponíveis. Alguns deles, como a extensão do Productivity Power Tools 2013 (baixe em bit.ly/1xE3EAT), você pode não querer viver sem ela. Você pode instalar essas extensões a partir da Web, ou você pode pesquisar dentro do Visual Studio por extensões online usando as extensões e a janela de atualizações no menu Ferramentas. Procure pela categoria Online para localizar as ferramentas mais populares como o Visual Assist e o ReSharper. Você pode até achar mais extensões na Galeria de código (bit.ly/11nzi9Q).

Mesmo as melhores ferramentas podem não mapear perfeitamente a tarefas específicas que você deseja executar ou automatizar dentro do IDE. Você provavelmente tem seus próprios scripts pessoais que você personalizou e ajustou para tornar seu trabalho mais fácil. Talvez você tenha um que verifica o diretório de compilação para uma compilação de sucesso, ou executa uma transformação em arquivos XML ou limpa todos os detritos de um processo de construção complexa. Como você gostaria de executar a sua ferramenta dentro do Visual Studio, como parte do IDE ou como parte de seu processo de criação? Agora você pode, usando o Visual Studio 2013 Community e o Visual Studio 2013 SDK.

Você pode começar fazendo o download do Visual Studio SDK. Ele fornece todas as bibliotecas, ferramentas e modelos de projeto para a criação de uma variedade de extensões diferentes. Vá em frente e instale-o e você estará pronto.

Configure as ferramentas para executar no Visual Studio

Depois de ter o SDK instalado, é muito fácil fazer sua ferramenta ou script executável executar a partir de um menu do Visual Studio. O Notepad.exe onipresente será o exemplo para este artigo, mas você pode usar qualquer executável ou integrar o seu próprio código no manipulador de comando.

Uma extensão básica é um binário do pacote do Visual Studio. Você pode localizar o modelo do pacote do Visual Studio na caixa de diálogo Novo Projeto em Visual Basic | Extensibilidade, C# | Extensibilidade, ou Outros tipos de projeto | Extensibilidade.

Este artigo demonstrará como fazer uma simples extensão que inicia o bloco de notas. Usaremos o modelo em C#/Extensibilidade para criar um projeto do pacote do Visual Studio C#. Vamos colocá-lo no diretório D:\Code e chamá-lo de StartNotepad. Esta extensão acabará iniciando o bloco de notas de um item de menu do Visual Studio IDE.

Uma vez que você clica duas vezes com o mouse no modelo, o Visual Studio inicia um assistente para ajudá-lo a configurar a extensão. Para os iniciantes, basta aceitar os padrões nas duas primeiras páginas de diálogo.

Em seguida, siga as etapas a seguir:

  1. Na página Selecionar Opções VSPackage, selecione a opção Comando do Menu.
  2. Na página Opções de comando, defina o nome de comando para iniciar o bloco de notas e a ID de comando para cmdidStartNotepad.
  3. Na página Opções de teste, desmarque as duas caixas de seleção.
  4. Clique em Concluir.

Neste ponto, você pode construir e executar o projeto de pacote. Quando o projeto é aberto, inicie a depuração (pressione a tecla F5, ou use o comando Iniciar na barra de ferramentas). Uma nova instância do Visual Studio Community 2013 será iniciada. Quando isso estiver concluído=, você verá o IDE, com um padrão para a página Inicial - Microsoft Visual Studio - Instância experimental na barra de título (consulte a Figura 1). Esta é a sua instância de teste do Visual Studio. Ele executa separadamente de sua instância de trabalho do Visual Studio, então você não precisa se preocupar com a contaminação oo seu próprio ambiente de desenvolvimento, se algo der errado.

A instância experimental do Visual Studio
Figura 1 A instância experimental do Visual Studio

A "instância experimental" é realmente apenas uma maneira elegante de anunciar que você lançou uma instância de área restrita do Visual Studio para testar a sua extensão. Ela tem todas as funções do Visual Studio Community 2013, mas não põe em risco o seu trabalho na instância do Visual Studio original. Para um exemplo tão simples, pode parecer um exagero. No entanto, se você construir uma estrutura do projeto inteiro ou um conjunto interdependente complexo de ferramentas de compilação, você não quer correr o risco de o seu código ser executado na mesma instância a partir da qual você está desenvolvendo.

No menu Ferramentas da instância experimental, abra a janela de Extensões e de Atualizações. Você deverá ver a extensão StartNotepad aqui (consulte Figura 2). (Se você abrir as Extensões e as Atualizações em sua instância de trabalho do Visual Studio, você não verá o StartNotePad.)

Extensões e Atualizações mostrando o StartNotepad
Figura 2 Extensões e Atualizações mostrando o StartNotepad

Você também verá Iniciar o bloco de notas no menu Ferramentas (consulte Figura 3).

Nova confirmação do item do menu para o StartNotepad em ferramentas
Figura 3 Nova confirmação do item do menu para o StartNotepad em ferramentas

Agora vá ao menu Ferramentas na instância experimental. Você deverá ver o comando Iniciar o bloco de notas. Neste ponto, ele apenas traz uma caixa de mensagem que diz "StartNotepad – Inside MSIT.StartNotepad.StartNotepadPackage.MenuItemCallback()." Você verá como realmente começar o bloco de notas a partir deste comando na próxima seção.

Configurar o comando do menu

Pare de depurar e volte para a sua instãncia de trabalho do Visual Studio. Abra o arquivo StartNotepadPackage.cs, que contém a classe do Pacote derivado. Este é o ponto de partida para todas as extensões VSPackage. O método de inicialização desta classe, na realidade, define o comando:

// Add our command handlers for menu (commands must exist in the .vsct file)
OleMenuCommandService mcs =
  GetService(typeof(IMenuCommandService)) as OleMenuCommandService;
if ( null != mcs )
{
  // Create the command for the menu item.
  CommandID menuCommandID = new CommandID(GuidList.guidStartNotepadCmdSet,
    (int)PkgCmdIDList.cmdidStartNotepad);
  MenuCommand menuItem = new MenuCommand(MenuItemCallback, menuCommandID );
  mcs.AddCommand( menuItem );
}

Não se preocupe com os detalhes deste código agora. Você deve observar que é assim que o comando do menu é instanciado. Os menus e outras insterfaces do usuário para extensões VSPackage são definidos, como o comentário do código diz, no arquivo .vsct.

O manipulador de comando é chamado de MenuItemCallback (na mesma classe StartNotepadPackage). Exclua o método existente e adicione o seguinte:

private void MenuItemCallback(object sender, EventArgs e)
{
  Process proc = new Process();
  proc.StartInfo.FileName = "notepad.exe";
  proc.Start();
}

Agora tente. Quando você começa a depuração do projeto e clica em Ferramentas | Iniciar o bloco de notas, você deve ver uma instância do bloco de notas. Na verdade, você terá uma nova instância do bloco de notas cada vez que você clicar em Iniciar o bloco de notas.

Você pode usar uma instância da classe System.Diagnostics.Process para executar qualquer executável, e não apenas o bloco de notas. Tente com calc.exe, por exemplo.

Defina a interface

Agora você usará o arquivo .vsct para definir a interface do usuário para a sua extensão. Dê uma olhada no arquivo StartNotepad.vsct. Este é um bom lugar para localizar todas as definições da interface do usuário do Visual Studio que você usará na sua extensão. É um arquivo XML, então prepare-se para as chaves do ângulo.

Localize o bloco de <Grupos>. Todos os comandos de menu devem pertencer a um grupo, que diz no Visual Studio onde colocar o comando. Neste caso, o comando está no menu Ferramentas, e seu pai é o menu Principal:

<Groups>
  <Group guid="guidStartNotepadCmdSet" 
    id="MyMenuGroup" priority="0x0600">
    <Parent guid="guidSHLMainMenu" id="IDM_VS_MENU_TOOLS"/>
  </Group>
</Groups>

(Não se preocupe muito com os detalhes ainda. Isso é apenas para mostrar onde os elementos importantes estão. O comando em si é definido dentro do bloco de <Botões>:

<Button guid="guidStartNotepadCmdSet" id="cmdidStartNotepad"
  priority="0x0100" type="Button">
  <Parent guid="guidStartNotepadCmdSet" id="MyMenuGroup" />
  <Icon guid="guidImages" id="bmpPic1" />
  <Strings>
    <ButtonText>Start Notepad</ButtonText>
  </Strings>
</Button>

Você pode ver que o botão é definido com um GUID (guidStartNotepadCmdSet, que é o mesmo que o Grupo GUID) e uma ID (cmdidStartNotepad, que é a ID especificada no assistente do pacote). O comando é o pai para o Grupo. Ele tem um ícone e algum texto. O ícone é um de um conjunto padrão de ícones incluídos na solução. A prioridade especifica a localização deste botão no menu, se houver vários comandos no grupo de comando. Os GUIDs e IDs para os grupos e os botões são definidos no bloco dos <Símbolos>:

<!-- This is the package GUID. -->
<GuidSymbol name="guidStartNotepadPkg"
  value="{18311db7-ca0f-419c-82b0-5aa14c8b541a}" />
<!-- This is the GUID used to group the menu commands together -->
<GuidSymbol name="guidStartNotepadCmdSet"
  value="{b0692a6d-a8cc-4b53-8b2d-17508c87f1ab}">
  <IDSymbol name="MyMenuGroup" value="0x1020" />
  <IDSymbol name="cmdidStartNotepad" value="0x0100" />
</GuidSymbol>

Os bitmaps também são definidos no bloco dos <Símbolos>:

<GuidSymbol name="guidImages" 
  value="{b8b810ad-5210-4f35-a491-c3464a612cb6}" >
  <IDSymbol name="bmpPic1" value="1" />
  <IDSymbol name="bmpPic2" value="2" />
  <IDSymbol name="bmpPicSearch" value="3" />
  <IDSymbol name="bmpPicX" value="4" />
  <IDSymbol name="bmpPicArrows" value="5" />
  <IDSymbol name="bmpPicStrikethrough" value="6" />
</GuidSymbol>

Tente mudar o ícone para um dos outros definidos aqui. Nenhuma das opções são particularmente apropriadas para o Bloco de Notas, então escolha o tachado porque mostra uma outra parte da configuração. Embora os ícones são definidos no bloco dos <Símbolos>, eles também devem ser listados no atributo usedList do bloco dos <Bitmaps>:

<Bitmap guid="guidImages" href="Resources\Images.png" usedList="bmpPic1,
  bmpPic2, bmpPicSearch, bmpPicX, bmpPicArrows"/>

Você vê que o bmpPicStrikethrough não está na lista, apesar de ter sido definido. Se você mudar o ícone para este bitmap, ele não aparecerá no menu. Então adicione o bmpPicStrikethrough:

<Bitmap guid="guidImages" href="Resources\Images.png" usedList="bmpPic1,
  bmpPic2, bmpPicSearch, bmpPicX, bmpPicArrows, bmpPicStrikethrough"/>

Agora você pode mudar o ícone para bmpPicStrikethrough para o botão de menu:

<Button guid="guidStartNotepadCmdSet" id="cmdidStartNotepad"
  priority="0x0100" type="Button">
  <Parent guid="guidStartNotepadCmdSet" id="MyMenuGroup" />
  <Icon guid="guidImages" id="bmpPicStrikethrough" />
  <Strings>
    <ButtonText>Start Notepad</ButtonText>
  </Strings>
</Button>

Agora você pode tentar. Quando a instância experimental vem de cima, você deve ver algo como na Figura 4 no menu de Ferramentas.

 O Comando para iniciar o Bloco de notas
Figura 4 O Comando para iniciar o Bloco de notas

Agora adicione um atalho de teclado para o comando do menu Iniciar o bloco de notas. Este exemplo usará o Ctrl+1. Se você adicionar um atalho de teclado, certifique-se de escolher uma combinação de teclas obscura para que o seu comando não colida com uma combinação mais padrão. Você pode fazer isso inteiramente no arquivo .vsct. Os atalhos de teclado são chamados de KeyBindings no arquivo .vsct. Adicione o seguinte bloco ao arquivo .vsct:

<KeyBindings>
  <KeyBinding guid="guidStartNotepadCmdSet" 
    id="cmdidStartNotepad"    
    editor="guidVSStd97" key1="1" mod1="CONTROL"/>
</KeyBindings>

O atributo key1 declara a chave normal e o atributo mod1 declara a tecla do modificador ou acelerador (normalmente Ctrl, Alt ou Shift) pressionada em conjunto com a tecla padrão. Se você adicionar mod2="ALT" para adicionar uma segunda tecla do modificador, você teria que ter o Ctrl+Alt+1 como o atalho. Fique com Ctrl+1 por enquanto. Tenha em mente, porém, que o arquivo .vsct é um bom lugar para começar suas personalizações. Agora, você pode começar a depuração. Reinicie o pacote. Quando o Instância Experimental vem de cima, pressione Ctrl+1. Você deve obter uma instância do Bloco de notas.

Mantenha a interface do usuário responsiva.

O método MenuItemCallback como ele existe atualmente não bloqueia o segmento de interface do usuário. Você ainda pode iniciar o bloco de notas com o comando Iniciar o bloco de notas (ou Ctrl+1). Você também pode continuar a fazer as coisas no IDE Visual Studio. Você pode mover a janela em volta, clicar em outros comandos nos menus e assim por diante. Imagine o que a sua ferramenta precisa para concluir seu trabalho antes de sair do manipulador. Em outras palavras, você precisa chamar o Process.WaitForExit.

Infelizmente, se você chamar o WaitForExit no segmento de interface do usuário do Visual Studio, como MenuItemCallback está fazendo agora, toda a interface do usuário do Visual Studio congela. Verifique isso em ação. No método MenuItemCallback, chame WaitForExit:

private void MenuItemCallback(object sender, EventArgs e)
{
  Process proc = new Process();
  proc.StartInfo.FileName = "notepad.exe";
  proc.Start();
  proc.WaitForExit();
}

Inicie a depuração, e quando a instância experimental vem de cima, pressione Ctrl+1. Você deverá ver a instância do Bloco de notas. Agora, tente mover a janela do Visual Studio (aquela experimental). Ela não funcionará. Você não pode fazer qualquer outra coisa na interface do usuário do Visual Studio, também. Você pode até mesmo ver a janela popup que diz, "O Microsoft Visual Studio está ocupado." Claramente, isso é algo que você precisa corrigir.

Felizmente, a correção é simples. Se você tiver uma ferramenta ou um processo que levará uma quantidade considerável de tempo para concluir, envolva-a em uma tarefa enom MenuItemCallback, assim:

private void MenuItemCallback(object sender, EventArgs e)
{
  ThreadHelper.JoinableTaskFactory.RunAsync(async delegate
  {
    Process proc = new Process();
    proc.StartInfo.FileName = "notepad.exe";
    proc.Start();
    await proc;
  });
}

Agora você deve ser capaz de executar a sua ferramenta e trabalhar no Visual Studio, ao mesmo tempo.

Limpe seu Experimento

Se você está desenvolvendo várias extensões, ou apenas explorando os resultados com diferentes versões do seu código de extensão, seu ambiente experimental pode parar de funcionar da maneira que deveria. Neste caso, você deve executar o script de reinicialização.

Este script é chamado de Redefinir a Instância Experimental do Visual Studio 2013 e envia como parte do SDK do Visual Studio 2013. Esse script remove todas as referências a suas extensões a partir do ambiente experimental, assim você pode começar do zero. Você pode chegar a este script de uma das duas formas:

  • A partir do desktop, localizando a Redefinição da Instância Experimental do Visual Studio 2013
  • Na linha de comando, execute o seguinte:
<VSSDK installation>\VisualStudioIntegration\Tools\Bin\
        CreateExpInstance.exe /Reset /VSInstance=12.0 
       /RootSuffix=Exp && PAUSE

Implante sua extensão

Agora que a sua extensão da ferramenta está sendo executada como deveria, é hora de pensar em compartilhá-la com seus amigos e colegas. Isso é fácil, contanto que eles tenham o Visual Studio 2013 instalado. Tudo que você tem que fazer é lhes enviar o arquivo .vsix que você construiu. Certifique-se de construí-lo no modo de Versão.

Você pode encontrar o arquivo .vsix para esta extensão no diretório do compartimento do StartNotepad. Supondo que você construiu a configuração da Versão, ela estará em \D:\Code\StartNotepad\StartNotepad\bin\Release\StartNotepad.vsix.

Para instalar a extensão, o usuário precisa fechar todas as instâncias abertas do Visual Studio, em seguida, clicar duas vezes com o mouse no arquivo .vsix para abrir o Instalador VSIX. Os arquivos são copiados para o diretório %LocalAppData%\­Microsoft\VisualStudio\12.0\Extensions.

Quando o usuário abre Visual Studio novamente, ele encontrará a extensão StartNotepad em Ferramentas|Extensões e Atualizações. Ele pode ir para Extensões e Atualizações para desinstalar ou desativar a extensão.

Aprenda a criar extensões que permitem que você faça a experiência do Visual Studio verdadeiramente sua. Ela também permite que você compartilhe suas melhores melhorias e recursos de produtividade com a comunidade. A Microsoft também adora quando você publica suas extensões.

Conclusão

Este artigo descreveu apenas uma pequena parte do que você pode fazer com as extensões do Visual Studio. Para saber mais sobre as extensões do Visual Studio em geral, consulte a página "Integrate Your App or Service with Visual Studio" em bit.ly/1zoIt59.

Para obter uma visão mais detalhada, consulte os artigos da biblioteca do MSDN na seção "Extending Visual Studio Overview" em bit.ly/1xWoA4k. E para obter alguns bons exemplos de código a ser usado para construir esse conhecimento, verifique a coleção de exemplos na galeria de exemplos do MSDN em bit.ly/1xWp5eD. Uma vez que você construiu e compartilhou algumas extensões, você pode realmente personalizar o ambiente do Visual Studio.


Susan Norwood trabalhou na Microsoft, principalmente escreveendo sobre o SDK do Visual Studio. Ela tem ajudado muitas pessoas a obter suas ferramentas integradas no Visual Studio.

Doug Erickson trabalhou como desenvolvedor e escritor técnico na Microsoft por 13 anos. Ele olha para a frente para que os desenvolvedores façam com que o Visual Studio Community desenvolva aplicativos e jogos para todas as plataformas.

Agradecemos aos seguintes especialistas técnicos da Microsoft pela revisão deste artigo: Anthony Cangialosi e Ryan Molden