Compartir a través de


La primera extensión de Visual Studio

Este artículo le guía por algunos pasos sencillos para poner en marcha su primera extensión de Visual Studio. Una extensión de Visual Studio se escribe mediante .NET Framework y C#. Si ya es desarrollador de .NET, encontrará que escribir extensiones es similar a escribir la mayoría de los demás programas y bibliotecas de .NET.

La extensión que escribirá hoy agrega un comando que inserta un nuevo guid en el editor de texto cuando se ejecute. Es sencillo, útil y proporciona una buena introducción a los diversos aspectos del desarrollo de extensiones.

Si es un aprendiz visual, consulte este breve vídeo de alguien que sigue el tutorial.

Antes de empezar a escribir su primera extensión de Visual Studio (es fácil, prometo),asegúrese de que tiene las herramientas necesarias.

Creación del proyecto

Hay varias plantillas de proyecto entre las que elegir, por lo que desea tomar la opción correcta. Las plantillas usadas en este kit de herramientas de la comunidad tienen el moniker (Comunidad) en el nombre.

La plantilla proyecto VSIX w/Command (Community) incluye un comando conectado, lo que facilita el inicio desde allí. Este es un excelente punto de partida para la mayoría de las extensiones. Si sabe que desea una ventana de herramientas, use la plantilla Proyecto vsIX con ventana de herramientas (comunidad). También tiene un comando para abrir la ventana de herramientas.

Use las plantillas Proyecto VSIX vacío (Comunidad) o Proyecto VSIX (Comunidad) para extensiones de solo MEF u otros escenarios avanzados.

Esta vez, seleccionará la plantilla Proyecto VSIX con comando (comunidad), como se muestra en la captura de pantalla siguiente.

New Project Dialog showing VSIX project templates.

Después de seleccionar la plantilla de proyecto, debe asignar un nombre al proyecto. Llámalo InsertGuid.

Configure your new project.

Después de pulsar el botón Crear , debería terminar con un proyecto VSIX básico similar al siguiente:

New project files and folders.

Archivos importantes

Vamos a repasar los archivos más importantes.

InsertGuidPackage.cs es lo que se conoce como la clase Package. Visual Studio llama a su InitializeAsync(...) método para inicializar la extensión. Desde aquí se agregan agentes de escucha de eventos y se registran comandos, ventanas de herramientas, configuración y otras cosas.

source.extension.vsixmanifest es el archivo de manifiesto de la extensión. Contiene metadatos, como título y descripción, pero también información sobre lo que contiene la extensión.

VSCommandTable.vsct es un archivo XML donde los comandos y los enlaces de clave se definen mediante declaración, por lo que se pueden registrar con Visual Studio.

Commands/MyCommand.cs es el controlador de comandos para el comando definido en el archivo VSCommandTable.vsct . Controla lo que sucede cuando se ejecuta el comando haciendo clic en el botón .

Modificación del comando

En primer lugar, quiere asegurarse de que el comando tiene el nombre, el icono y la posición correctos en el sistema de menús de Visual Studio.

Abra el archivo VSCommandTable.vsct y busque y <Group> .<Button> Observe cómo el botón especifica el grupo como su elemento primario y el elemento primario del grupo es el menú integrado VSMainMenu/Tools .

Para la extensión, quiere que el botón insertar comando GUID esté en el menú Principal Editar , por lo que va a volver a primario el grupo en el menú Editar. Reemplace Herramientas por Editar igual que en el fragmento de código siguiente:

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

Puede obtener IntelliSense completo para las ubicaciones para facilitar la búsqueda del lugar adecuado.

VSCT parent IntelliSense.

Las <Button> necesidades también se actualizan. Le dará un nuevo icono actualizando el id atributo del <Icon> elemento a PasteAppend. Actualice el <ButtonText> texto con un nombre correcto, descriptivo y actualice con <LocCanonicalName> el nombre técnico del comando: este es el nombre que se muestra a los usuarios cuando asignan métodos abreviados de teclado personalizados al comando en el cuadro de diálogo Teclado del entorno > de opciones > de herramientas>.

<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>

Nota:

Inicie <LocCanonicalName> siempre con un carácter de punto. Garantiza que ningún otro texto esté preinscrito automáticamente y no se mostrará el punto.

Puede usar los miles de iconos disponibles en la biblioteca de imágenes de Visual Studio e incluso obtener una vista previa que se muestra en IntelliSense:

VSCT icon IntelliSense.

Ahora, ha actualizado el nombre, el icono y la ubicación de nuestro comando y es el momento de escribir código para insertar el guid en el editor de texto.

Abra el archivo /Commands/MyCommand.cs y modifíquelo para insertar un nuevo guid cuando se ejecute:

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()); 
        }
    }
}

Está usando el VS objeto para obtener la vista de texto del editor activo y, a continuación, insertar el guid en la posición del símbolo de intercalación del búfer de texto.

Nota:

await JoinableTaskFactory.SwitchToMainThreadAsync() Verá y ThreadHelper.ThrowIfNotOnUIThread() en muchos lugares de este kit de herramientas de la comunidad. Controlan los procedimientos recomendados de conmutación de subprocesos y no es necesario saber cuándo y cómo usarlos en este punto: las advertencias del compilador con correcciones de código (bombillas) hacen que sea muy fácil.

El primer borrador de nuestra extensión ahora está completo y es el momento de probarlo.

Ejecución y depuración

Ejecutar la extensión es tan fácil como ejecutar cualquier otro proyecto de .NET. Simplemente presione F5 para ejecutar con el depurador asociado o Ctrl+F5 para ejecutarse sin.

Al hacerlo, se iniciará la instancia experimental de Visual Studio con la extensión instalada. La instancia experimental es la versión normal de Visual Studio, pero con configuraciones y extensiones independientes instaladas. Ayuda a mantener las cosas separadas.

Cuando se inicie la instancia experimental, debería ver el comando Insertar GUID en el menú principal Editar .

Insert GUID command located in the Edit main menu.

Abra cualquier archivo basado en texto y ejecute el comando para insertar un nuevo guid. Eso es todo.

Resumen

Ahora ha creado la primera extensión que agrega un botón de comando al menú principal e interactúa con el editor de texto cuando se ejecuta.

¡¡Felicitaciones!!

Puede encontrar el código de esta extensión en el repositorio de ejemplos.