Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Este documento es un inicio rápido que muestra cómo crear la primera extensión mediante VisualStudio.Extensibility. La extensión se ejecuta fuera de proceso, lo que significa fuera del proceso de Visual Studio.
Prerequisites
- se recomienda Visual Studio 2026 versión 18.11 o posterior con la carga de trabajo "Desarrollo de extensiones de Visual Studio". Para versiones anteriores, VisualStudio.Extensibility requiere Visual Studio 2022 versión 17.9 o posterior.
Creación del proyecto de extensión
Visual Studio 18.11 o posterior (recomendado)
Use la plantilla modern VSIX Project y seleccione VisualStudio.Extensibility (Out-Of-Process) en Tipo de extensión. El valor predeterminado de la plantilla es VSSDK, así que seleccione la opción fuera de proceso para este inicio rápido.
Siga Crear una extensión con la plantilla de proyecto VSIX moderna para conocer los pasos del asistente y las opciones del SDK del proyecto.
Versiones anteriores de Visual Studio
Use la plantilla VisualStudio.Extensibility Project para crear un nuevo proyecto de extensibilidad.
En este momento, está listo para empezar a extender Visual Studio agregando comandos y componentes del editor a la extensión.
La clase Extension
La plantilla crea una clase que extiende Extension ↗ . Esta es la primera clase que se instancia cuando se carga tu extensión. En el InitializeServices ↗ método, puede agregar sus propios servicios a la colección de servicios para que estén disponibles para la inyección de dependencias.
[VisualStudioContribution]
internal class ExtensionEntrypoint : Extension
{
public override ExtensionConfiguration ExtensionConfiguration => new()
{
Metadata = new(
id: "MyExtension.abc123",
version: this.ExtensionAssemblyVersion,
publisherName: "My Company",
displayName: "My Extension"),
};
protected override void InitializeServices(IServiceCollection serviceCollection)
{
base.InitializeServices(serviceCollection);
// You can configure dependency injection here by adding services to the serviceCollection.
}
}
También puede ver el VisualStudioContribution ↗ atributo que se usa para marcar los componentes de extensión que están diseñados para ser consumidos por Visual Studio. Este atributo se puede aplicar a las clases que implementan IVisualStudioContributionClass ↗ o las propiedades estáticas de un tipo que implementa IVisualStudioContributionProperty ↗ .
Añade tu primer comando
La plantilla crea Command1.cs como el primer controlador de comandos, que puede usar como punto de partida. Dado que queremos que Visual Studio reconozca este comando y la clase Command ↗ implementa IVisualStudioContributionClass ↗, el comando se marca con el atributo VisualStudioContribution.
[VisualStudioContribution]
internal class Command1 : Command
{
El comando tiene una propiedad de configuración denominada CommandConfiguration ↗ , que define su nombre para mostrar, icono y ubicación en el Extensions menú.
public override CommandConfiguration CommandConfiguration => new("%MyExtension.Command1.DisplayName%")
{
// Use this object initializer to set optional parameters for the command. The required parameter,
// displayName, is set above. DisplayName is localized and references an entry in .vsextension\string-resources.json.
Icon = new(ImageMoniker.KnownValues.Extension, IconSettings.IconAndText),
Placements = new[] { CommandPlacement.KnownPlacements.ExtensionsMenu },
};
El compilador de C# evalúa las propiedades de configuración al compilar la extensión y sus valores se guardan como metadatos de extensión para que Visual Studio puedan leerlo sin cargar el ensamblado de extensión. Por este motivo, las propiedades de configuración tienen restricciones adicionales en comparación con las propiedades normales (por ejemplo, deben ser de solo lectura).
Puede ver que el nombre para mostrar del comando es "%MyExtension.Command1.DisplayName%", que hace referencia a la MyExtension.Command1.DisplayName cadena en el .vsextension/string-resources.json archivo, lo que permite localizar esta cadena.
Cuando se ejecuta el comando, Visual Studio llama al método ExecuteCommandAsync ↗ donde puede colocar un punto de interrupción. Puede usar el context argumento o this.Extensibility para interactuar con Visual Studio.
Por ejemplo, un controlador de comandos podría ser el siguiente:
public override async Task ExecuteCommandAsync(IClientContext context, CancellationToken cancellationToken)
{
await this.Extensibility.Shell().ShowPromptAsync(
"Hello from an extension!",
PromptOptions.OK,
cancellationToken);
}
Para obtener más información sobre cómo agregar comandos, consulte la sección Comandos .
Depura tu extensión
Asegúrese de que el proyecto de extensión está seleccionado como proyecto de inicio en Visual Studio y presione
F5para iniciar la depuración.Al presionar
F5, se compila la extensión y se implementa en la instancia experimental de la versión de Visual Studio que esté usando. El depurador debería adjuntarse cuando se cargue la extensión.Puede encontrar el nuevo comando en
Extensionsel menú, como se muestra en la siguiente imagen:
Pasos siguientes
- Agregar un comando — la función inicial más común para crear
- Ventanas de herramientas — agregar paneles de interfaz de usuario personalizados
- Anatomía de una extensión : comprender la estructura del proyecto y los conceptos clave
- Explorar todos los ejemplos ↗ — extensiones totalmente funcionales en GitHub