Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Um workspace é a forma como o Visual Studio representa qualquer coleção de arquivos na funcionalidade Abrir Pasta, e é representado pelo tipo IWorkspace. Por si só, o workspace não entende o conteúdo ou os recursos relacionados aos arquivos dentro da pasta. Em vez disso, ele fornece um conjunto geral de APIs para que recursos e extensões possam produzir e consumir dados sobre os quais outras pessoas podem tomar ação. Os produtores são compostos por meio do MEF (Managed Extensibility Framework) usando vários atributos de exportação.
Provedores e serviços de espaço de trabalho
Os provedores e serviços de espaço de trabalho fornecem os dados e as funcionalidades para responder ao conteúdo de um espaço de trabalho. Eles podem fornecer informações de arquivo contextuais, símbolos em arquivos de origem ou funcionalidade de build.
Ambos os conceitos usam um padrão de fábrica e são importados por meio do MEF pelo workspace. Todos os atributos de exportação implementam IProviderMetadataBase ou IWorkspaceServiceFactoryMetadata, mas há tipos concretos que as extensões devem usar para tipos exportados.
Uma diferença entre provedores e serviços é a relação deles com o workspace. Um workspace pode ter muitos provedores de um tipo específico, mas apenas um serviço de um tipo específico é criado por workspace. Por exemplo, um workspace tem muitos provedores de verificador de arquivos, mas o workspace tem apenas um serviço de indexação por workspace.
Outra diferença importante é o consumo de dados de provedores e serviços. O workspace é o ponto de entrada para obter dados de provedores por alguns motivos. Primeiro, os provedores normalmente têm algum conjunto estreito de dados que criam. Os dados podem ser símbolos para um arquivo fonte C# ou contextos de arquivo de compilação para um arquivo de CMakeLists.txt. O workspace corresponderá à solicitação de um consumidor aos provedores cujos metadados se alinhem com a solicitação feita. Em segundo lugar, alguns cenários permitem que muitos provedores contribuam para uma solicitação, enquanto outros cenários usam o provedor com prioridade mais alta.
Por outro lado, as extensões podem obter instâncias e interagir diretamente com os serviços do workspace. Os métodos de extensão em IWorkspace estão disponíveis para os serviços fornecidos pelo Visual Studio, como GetFileWatcherService. Sua extensão pode oferecer um serviço de espaço de trabalho para componentes dentro de sua extensão ou para serem utilizadas por outras extensões. Os consumidores devem usar GetServiceAsync ou um método de extensão que você forneça para o tipo IWorkspace.
Aviso
Não crie serviços que entrem em conflito com o Visual Studio. Isso pode levar a problemas inesperados.
Descarte no fechamento do workspace
Ao fechar um workspace, os extensores podem precisar descartar, mas ainda assim chamar código assíncrono. A interface IAsyncDisposable está disponível para facilitar a gravação desse código.
Tipos relacionados
- IWorkspace é a entidade central de um workspace aberto, como uma pasta aberta.
- IWorkspaceProviderFactory<T> cria um provedor por workspace instanciado.
- IWorkspaceServiceFactory cria um serviço por espaço de trabalho instanciado.
- IAsyncDisposable deve ser implementado em provedores e serviços que precisam executar código assíncrono durante o descarte.
- WorkspaceServiceHelper fornece métodos auxiliares para acessar serviços conhecidos ou serviços arbitrários.
Configurações do workspace
Os workspaces têm um serviço IWorkspaceSettingsManager com controle simples, mas poderoso sobre eles. Para obter uma visão geral básica das configurações, consulte Personalizar tarefas de compilação e depuração.
As configurações para a maioria dos tipos de SettingsType são arquivos .json, como VSWorkspaceSettings.json e tasks.vs.json.
O poder das configurações do workspace gira ao redor de "escopos", que são simplesmente caminhos dentro do workspace. Quando um consumidor chama GetAggregatedSettings, todos os escopos que incluem o caminho solicitado e o tipo de configuração são agregados. A prioridade de agregação de escopo é a seguinte:
- "Configurações locais", que normalmente é o diretório
.vsda raiz do espaço de trabalho. - O caminho solicitado propriamente dito.
- O diretório pai do caminho solicitado.
- Todos os diretórios pai adicionais até e incluindo a raiz do workspace.
- "Configurações globais", que está em um diretório de usuário.
O resultado é uma instância de IWorkspaceSettings. Esse objeto contém as configurações de um tipo específico e pode ser consultado para definir nomes de chave armazenados como string. Os métodos GetProperty e os métodos de extensão WorkspaceSettingsExtensions esperam que o chamador saiba o tipo do valor de configuração que está sendo solicitado. Como a maioria dos arquivos de configurações é mantida como arquivos .json, muitas invocações usarão string, bool, inte matrizes desses tipos. Também há suporte para tipos de objeto. Nesses casos, você pode usar IWorkspaceSettings ele mesmo como o argumento de tipo. Por exemplo:
{
"intValue": 1,
"stringValue": "s",
"boolValue": true,
"stringArray": [
"s1",
"s2"
],
"nestedIWorkspaceSettings": {
"nestedString": "ns"
}
}
Supondo que essas configurações estavam no VSWorkspaceSettings.jsonde um usuário, os dados podem ser acessados como:
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
Essas APIs de configurações não estão relacionadas às APIs disponíveis no namespace Microsoft.VisualStudio.Settings. As configurações do workspace são independentes do host e usam arquivos de configurações específicos do workspace ou provedores de configurações dinâmicas.
Fornecendo configurações dinâmicas
As extensões podem fornecer IWorkspaceSettingsProviders. Esses provedores na memória permitem que as extensões adicionem configurações ou substituam outras.
Exportar um IWorkspaceSettingsProvider é diferente de outros provedores de workspace. A fábrica não está marcada como IWorkspaceProviderFactory e não há nenhum tipo de atributo especial. Em vez disso, implemente IWorkspaceSettingsProviderFactory e 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);
}
Dica
Ao implementar métodos que retornam IWorkspaceSettingsSource (como IWorkspaceSettingsProvider.GetSingleSettings), retorne uma instância de IWorkspaceSettings em vez de IWorkspaceSettingsSource.
IWorkspaceSettings fornece mais informações que podem ser úteis durante algumas agregações de configurações.
APIs relacionadas a configurações
- IWorkspaceSettingsManager lê e agrega as configurações do ambiente de trabalho.
-
GetSettingsManager obtém o
IWorkspaceSettingsManagerde um workspace. - GetAggregatedSettings reúne as configurações para um escopo específico, agregadas em todos os escopos sobrepostos.
- IWorkspaceSettings contém configurações para um escopo específico.
Práticas sugeridas para o espaço de trabalho
- Retorne objetos de
IWorkspaceProviderFactory.CreateProviderou de APIs semelhantes que lembrem do contexto doWorkspacedelas quando forem criadas. As interfaces de provedores são escritas esperando que esse objeto seja mantido desde a criação. - Salve caches ou configurações específicas do workspace no caminho "Configurações locais" do workspace. Crie um caminho para o arquivo usando
Microsoft.VisualStudio.Workspace.WorkspaceHelper.MakeRootedUnderWorkingFolderno Visual Studio 2017 versão 15.6 ou posterior. Para versões anteriores à versão 15.6, use o seguinte snippet:
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 solução e carregamento automático do pacote
Pacotes carregados podem implementar IVsSolutionEvents7 e invocar IVsSolution.AdviseSolutionEvents. Ele inclui eventos de abertura e fechamento de pasta no Visual Studio.
Um contexto de interface do usuário pode ser usado para carregar automaticamente seu pacote. O valor é 4646B819-1AE0-4E79-97F4-8A8176FDD664.
Resolução de Problemas
O pacote SourceExplorerPackage não foi carregado corretamente
A extensibilidade do workspace é fortemente baseada em MEF e erros de composição farão com que o pacote que hospeda a Pasta Aberta falhe ao carregar. Por exemplo, se uma extensão exportar um tipo com ExportFileContextProviderAttribute, mas o tipo só implementar IWorkspaceProviderFactory<IFileContextActionProvider>, ocorrerá um erro ao tentar abrir uma pasta no Visual Studio.
Os detalhes do erro podem ser encontrados em %LOCALAPPDATA%\Microsoft\VisualStudio\16.0_id\ComponentModelCache\Microsoft.VisualStudio.Default.err. Resolva os erros para os tipos implementados pela sua extensão.
Conteúdo relacionado
- Contextos de arquivo – provedores de contexto de arquivo trazem inteligência de código para abrir workspaces de pasta.
- Indexação – A indexação da área de trabalho coleta e armazena informações sobre o workspace.