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.
Un área de trabajo es la forma en que Visual Studio representa cualquier colección de archivos en Abrir carpeta, y se representa mediante el tipo IWorkspace. Por sí mismo, el área de trabajo no entiende el contenido ni las características relacionadas con los archivos de la carpeta. En su lugar, proporciona un conjunto general de API para características y extensiones para generar y consumir datos sobre los que otros usuarios pueden actuar. Los productores se estructuran por medio de Managed Extensibility Framework (MEF) utilizando varios atributos de exportación.
Proveedores y servicios del área de trabajo
Los proveedores y servicios del área de trabajo proporcionan los datos y la funcionalidad para reaccionar al contenido de un área de trabajo. Pueden proporcionar información de archivo contextual, símbolos en archivos de origen o funcionalidad de compilación.
Ambos conceptos usan un patrón de fábrica y se importan a través de MEF por el área de trabajo. Todos los atributos de exportación implementan IProviderMetadataBase o IWorkspaceServiceFactoryMetadata, pero hay tipos concretos que las extensiones deben usar para los tipos exportados.
Una diferencia entre los proveedores y los servicios es su relación con el área de trabajo. Un área de trabajo puede tener muchos proveedores de un tipo determinado, pero solo se crea un servicio de un tipo determinado por área de trabajo. Por ejemplo, un área de trabajo tiene muchos proveedores de analizadores de archivos, pero el área de trabajo solo tiene un servicio de indexación por área de trabajo.
Otra diferencia clave es el consumo de datos de proveedores y servicios. El área de trabajo es el punto de entrada para obtener datos de proveedores por un par de motivos. En primer lugar, los proveedores suelen tener un conjunto estrecho de datos que crean. Los datos pueden ser símbolos de un archivo de origen de C# o contextos de archivo de compilación para un archivo de CMakeLists.txt. El área de trabajo coincidirá con la solicitud de un consumidor a los proveedores cuyos metadatos se alinean con la solicitud. En segundo lugar, algunos escenarios permiten que muchos proveedores contribuyan a una solicitud, mientras que otros escenarios usan el proveedor con prioridad más alta.
Por el contrario, las extensiones pueden acceder a e interactuar directamente con los servicios del área de trabajo. Los métodos de extensión de IWorkspace están disponibles para los servicios proporcionados por Visual Studio, como GetFileWatcherService. La extensión puede ofrecer un servicio de área de trabajo para componentes dentro de la extensión o para ser utilizado por otras extensiones. Los consumidores deberían utilizar GetServiceAsync o un método de extensión que usted proporcione para el tipo IWorkspace.
Advertencia
No cree servicios que entren en conflicto con Visual Studio. Puede provocar problemas inesperados.
Eliminación al cerrar el área de trabajo
Al cerrar un área de trabajo, es posible que las extensiones necesiten liberar recursos y llamar a código asincrónico. La interfaz IAsyncDisposable está disponible para facilitar la escritura de este código.
Tipos relacionados
- IWorkspace es la entidad central de un área de trabajo abierta, como una carpeta abierta.
- IWorkspaceProviderFactory<T> genera un proveedor por cada área de trabajo instanciada.
- IWorkspaceServiceFactory crea un servicio por cada área de trabajo instanciada.
- IAsyncDisposable debe implementarse en proveedores y servicios que necesiten ejecutar código asincrónico durante la liberación.
- WorkspaceServiceHelper proporciona métodos auxiliares para acceder a servicios conocidos o servicios arbitrarios.
Configuración del área de trabajo
Las áreas de trabajo tienen un servicio IWorkspaceSettingsManager con un control sencillo pero eficaz sobre un área de trabajo. Para una visión general básica de los ajustes, consulte Personalizar tareas de compilación y depuración.
La configuración para la mayoría de los tipos SettingsType son archivos .json, como VSWorkspaceSettings.json y tasks.vs.json.
La eficacia de la configuración del área de trabajo se centra en "ámbitos", que son simplemente rutas de acceso dentro del área de trabajo. Cuando un usuario llama a GetAggregatedSettings, se agregan todos los ámbitos que incluyen la ruta de acceso solicitada y el tipo de configuración. La prioridad de agregación de ámbito es la siguiente:
- "Configuración local", que suele ser el directorio
.vsde la raíz del área de trabajo. - La ruta de acceso solicitada en sí misma.
- Directorio primario de la ruta de acceso solicitada.
- Todos los directorios principales adicionales hasta e incluyendo la raíz del área de trabajo.
- "Configuración global", que se encuentra en un directorio de usuario.
El resultado es una instancia de IWorkspaceSettings. Este objeto contiene la configuración de un tipo determinado y se puede consultar para establecer nombres de clave almacenados como string. Los métodos GetProperty y los métodos de extensión WorkspaceSettingsExtensions esperan que el autor de la llamada conozca el tipo del valor de configuración que se solicita. Dado que la mayoría de los archivos de configuración se conservan como archivos .json, muchas invocaciones usarán string, bool, inty matrices de esos tipos. También se admiten tipos de objeto. En esos casos, puede usar IWorkspaceSettings como argumento de tipo. Por ejemplo:
{
"intValue": 1,
"stringValue": "s",
"boolValue": true,
"stringArray": [
"s1",
"s2"
],
"nestedIWorkspaceSettings": {
"nestedString": "ns"
}
}
Suponiendo que estos ajustes estuvieran en la VSWorkspaceSettings.json de un usuario, se puede acceder a los datos de la siguiente manera:
using System.Collections.Generic;
using Microsoft.VisualStudio.Workspace;
using Microsoft.VisualStudio.Workspace.Settings;
private static void ReadSettings(IWorkspace workspace)
{
IWorkspaceSettingsManager settingsManager = workspace.GetSettingsManager();
IWorkspaceSettings settings = settingsManager.GetAggregatedSettings(SettingsTypes.Generic);
// result == WorkspaceSettingsResult.Success
WorkspaceSettingsResult result = settings.GetProperty("intValue", out int intValue);
result = settings.GetProperty("stringValue", out string stringValue);
result = settings.GetProperty("boolValue", out bool boolValue);
result = settings.GetProperty("stringArray", out string[] stringArray);
result = settings.GetProperty("nestedIWorkspaceSettings", out IWorkspaceSettings nestedIWorkspaceSettings);
result = nestedIWorkspaceSettings.GetProperty("nestedString", out string nestedString);
// Extension method alternative using default values.
int intValueOrDefault = settings.Property("intValue", /* default */ 42);
// Missing key. result == WorkspaceSettingsResult.Undefined
result = settings.GetProperty("missing", out string missing);
// Wrong type for a key. result == WorkspaceSettingsResult.Error
result = settings.GetProperty("intValue", out IWorkspaceSettings notSettings);
// Special ability to union "stringArray" across all scopes.
IEnumerable<string> allStringArray = settings.UnionPropertyArray<string>("stringArray");
}
Nota
Estas API de configuración no están relacionadas con las API disponibles en el espacio de nombres Microsoft.VisualStudio.Settings. La configuración del área de trabajo es independiente del host y usa archivos de configuración específicos del área de trabajo o proveedores de configuración dinámica.
Proporcionar configuraciones dinámicas
Las extensiones pueden proporcionar IWorkspaceSettingsProvider. Estos proveedores en memoria permiten que las extensiones agreguen configuraciones o invaliden otras.
La exportación de IWorkspaceSettingsProvider es diferente de otros proveedores de áreas de trabajo. La fábrica no es IWorkspaceProviderFactory y no hay un tipo de atributo especial. En su lugar, implemente IWorkspaceSettingsProviderFactory y use [Export(typeof(IWorkspaceSettingsProviderFactory))].
// Common workspace provider factory pattern
[ExportFeatureProvider(some, args, to, export)]
internal class MyProviderFactory : IWorkspaceProviderFactory<IFeatureProvider>
{
IFeatureProvider CreateProvider(IWorkspace workspace) => new Provider(workspace);
}
// IWorkspaceSettingsProvider pattern
[Export(typeof(IWorkspaceSettingsProviderFactory))]
internal class MySettingsProviderFactory : IWorkspaceSettingsProviderFactory
{
// 100 is typically the value used by built-in settings providers. Lower value is higher priority.
int Priority => 100;
IWorkspaceSettingsProvider CreateSettingsProvider(IWorkspace workspace) => new MySettingsProvider(workspace);
}
Sugerencia
Al implementar métodos que devuelven IWorkspaceSettingsSource (como IWorkspaceSettingsProvider.GetSingleSettings), devuelve una instancia de IWorkspaceSettings en lugar de IWorkspaceSettingsSource.
IWorkspaceSettings proporciona más información que puede resultar útil durante algunas agregaciones de configuración.
APIs relacionadas con las configuraciones
- IWorkspaceSettingsManager lee y consolida la configuración del área de trabajo.
-
GetSettingsManager obtiene
IWorkspaceSettingsManagerde un área de trabajo. - GetAggregatedSettings obtiene la configuración para un ámbito dado, agregada a través de todos los ámbitos superpuestos.
- IWorkspaceSettings contiene la configuración de un ámbito determinado.
Prácticas sugeridas para el espacio de trabajo
- Devuelve objetos de
IWorkspaceProviderFactory.CreateProvidero API similares que recuerden su contexto deWorkspaceen el momento de su creación. Las interfaces de los proveedores se escriben con la expectativa de que este objeto se mantenga después de su creación. - Guarde las memorias caché o la configuración específicas del área de trabajo en la ruta de acceso "Configuración local" del área de trabajo. Cree una ruta de acceso para el archivo mediante
Microsoft.VisualStudio.Workspace.WorkspaceHelper.MakeRootedUnderWorkingFolderen Visual Studio 2017, versión 15.6 o posterior. Para las versiones anteriores a la versión 15.6, use el siguiente fragmento de código:
using System.IO;
using Microsoft.VisualStudio.Workspace;
using Microsoft.VisualStudio.Workspace.Settings;
private static string MakeRootedUnderWorkingFolder(IWorkspace workspace, string relativePath)
{
string workingFolder = workspace.GetSettingsManager().GetAggregatedSettings(SettingsTypes.WorkspaceControlSettings).Property<string>("WorkingFolder");
return Path.Combine(workingFolder, relativePath);
}
Eventos de solución y carga automática de paquetes
Los paquetes cargados pueden implementar IVsSolutionEvents7 e invocar IVsSolution.AdviseSolutionEvents. Incluye eventos al abrir y cerrar una carpeta en Visual Studio.
Se puede usar un contexto de interfaz de usuario para cargar automáticamente el paquete. El valor es 4646B819-1AE0-4E79-97F4-8A8176FDD664.
Solución de problemas
El paquete SourceExplorerPackage no se cargó correctamente
La extensibilidad del área de trabajo está muy basada en MEF y los errores de composición harán que el paquete que hospeda Open Folder no se cargue. Por ejemplo, si una extensión exporta un tipo con ExportFileContextProviderAttribute, pero el tipo solo implementa IWorkspaceProviderFactory<IFileContextActionProvider>, se producirá un error al intentar abrir una carpeta en Visual Studio.
Los detalles del error se pueden encontrar en %LOCALAPPDATA%\Microsoft\VisualStudio\16.0_id\ComponentModelCache\Microsoft.VisualStudio.Default.err. Resuelva los errores de los tipos implementados por la extensión.
Contenido relacionado
- Contextos de archivo: Los proveedores de contextos de archivo aportan inteligencia de código para las áreas de trabajo de Open Folder.
- Indexación: la indexación del espacio de trabajo recopila y conserva información sobre la área de trabajo.