Dela via


Arbetsytor

En arbetsyta är hur Visual Studio representerar en samling filer i Open Folderoch den representeras av typen IWorkspace. Arbetsytan förstår i sig inte innehållet eller funktionerna som är relaterade till filer i mappen. I stället tillhandahåller den en allmän uppsättning API:er för funktioner och tillägg för att producera och använda data som andra kan agera på. Producenterna skapas genom Managed Extensibility Framework (MEF) med hjälp av olika exportattribut.

Leverantörer och tjänster för arbetsytor

Leverantörer och tjänster för arbetsytor tillhandahåller data och funktioner för att reagera på innehållet i en arbetsyta. De kan ge sammanhangsberoende filinformation, symboler i källfiler eller byggfunktioner.

Båda begreppen använder ett fabriksmönster och importeras via MEF av arbetsytan. Alla exportattribut implementerar IProviderMetadataBase eller IWorkspaceServiceFactoryMetadata, men det finns konkreta typer som tillägg bör använda för exporterade typer.

En skillnad mellan leverantörer och tjänster är deras relation till arbetsytan. En arbetsyta kan ha många leverantörer av en viss typ, men endast en tjänst av en viss typ skapas per arbetsyta. En arbetsyta har till exempel många filskannerproviders, men arbetsytan har bara en indexeringstjänst per arbetsyta.

En annan viktig skillnad är förbrukning av data från leverantörer och tjänster. Arbetsytan är startpunkten för att hämta data från leverantörer av några anledningar. För det första har leverantörer vanligtvis en smal uppsättning data som de skapar. Data kan vara symboler för en C#-källfil eller skapa filkontexter för en CMakeLists.txt fil. Arbetsytan kommer att matcha en konsuments förfrågan till de leverantörer vars metadata stämmer överens med förfrågan. För det andra gör vissa scenarier att många leverantörer kan bidra till en begäran medan andra scenarier använder providern med högsta prioritet.

Däremot kan tillägg hämta instanser av och interagera direkt med tjänster i arbetsytan. Tilläggsmetoder på IWorkspace är tillgängliga för de tjänster som tillhandahålls av Visual Studio, till exempel GetFileWatcherService. Tillägget kan erbjuda en arbetsytetjänst för komponenter i tillägget eller för andra tillägg att använda. Konsumenter bör använda GetServiceAsync eller en tilläggsmetod som du anger för den IWorkspace typen.

Varning

Skapa inte tjänster som är i konflikt med Visual Studio. Det kan leda till oväntade problem.

Avyttring vid stängning av arbetsyta

Vid stängning av en arbetsyta kan utökare behöva frigöra resurser, men kanske också behöva anropa asynkron kod. Det IAsyncDisposable gränssnittet är tillgängligt för att göra det enkelt att skriva den här koden.

Inställningar för arbetsyta

Arbetsytor har en IWorkspaceSettingsManager tjänst med enkel men kraftfull kontroll över en arbetsyta. En grundläggande översikt över inställningar finns i Anpassa bygg- och felsökningsuppgifter.

Inställningar för de flesta SettingsType typer är .json filer, till exempel VSWorkspaceSettings.json och tasks.vs.json.

Kraften i arbetsyteinställningarna kretsar kring "omfång", som helt enkelt är sökvägar i arbetsytan. När en konsument anropar GetAggregatedSettingsaggregeras alla omfång som innehåller den begärda sökvägen och typen av inställning. Omfångsaggregeringsprioritet är följande:

  1. "Lokala inställningar", vilket vanligtvis är arbetsyterotens .vs-mapp.
  2. Den begärda sökvägen i sig.
  3. Den överordnade katalogen för den begärda sökvägen.
  4. Alla ytterligare överordnade kataloger upp till och med arbetsytans rot.
  5. "Globala inställningar", som finns i en användarkatalog.

Resultatet är en instans av IWorkspaceSettings. Det här objektet innehåller inställningarna för en viss typ och kan efterfrågas för att ange nyckelnamn som lagras som string. De GetProperty metoderna och WorkspaceSettingsExtensions tilläggsmetoderna förväntar sig att anroparen ska veta vilken typ av inställningsvärde som begärs. Eftersom de flesta inställningsfiler sparas som .json filer använder många anrop string, bool, intoch matriser av dessa typer. Objekttyper stöds också. I dessa fall kan du använda IWorkspaceSettings som typargument. Till exempel:

{
  "intValue": 1,
  "stringValue": "s",
  "boolValue": true,
  "stringArray": [
    "s1",
    "s2"
  ],
  "nestedIWorkspaceSettings": {
    "nestedString": "ns"
  }
}

Förutsatt att dessa inställningar fanns i en användares VSWorkspaceSettings.jsonkan data nås som:

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

Not

De här inställnings-API:erna är inte relaterade till de API:er som är tillgängliga i Microsoft.VisualStudio.Settings namnområdet. Inställningar för arbetsytan är oberoende av värddatorn och använder arbetsytespecifika inställningsfiler eller dynamiska inställningsleverantörer.

Tillhandahålla dynamiska inställningar

Tillägg kan ge IWorkspaceSettingsProviders. Dessa minnesinterna leverantörer tillåter tillägg att lägga till inställningar eller åsidosätta andra.

Export av en IWorkspaceSettingsProvider skiljer sig från andra leverantörer av arbetsytor. Fabriken är inte IWorkspaceProviderFactory och det finns ingen särskild attributtyp. Implementera i stället IWorkspaceSettingsProviderFactory och använd [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);
}

Tips

När du implementerar metoder som returnerar IWorkspaceSettingsSource (till exempel IWorkspaceSettingsProvider.GetSingleSettings) returnerar du en instans av IWorkspaceSettings i stället för IWorkspaceSettingsSource. IWorkspaceSettings innehåller mer information som kan vara användbar under vissa inställningsaggregeringar.

Föreslagna metoder för arbetsutrymme

  • Returnera objekt från IWorkspaceProviderFactory.CreateProvider eller liknande API:er som kommer ihåg deras Workspace kontext när de skapas. Gränssnitten för leverantörer skrivs med förväntningen att det här objektet sparas när det skapas.
  • Spara arbetsytespecifika cacheminnen eller inställningar inom arbetsytans mapp "Lokala inställningar". Skapa en sökväg för filen med hjälp av Microsoft.VisualStudio.Workspace.WorkspaceHelper.MakeRootedUnderWorkingFolder i Visual Studio 2017 version 15.6 eller senare. Använd följande kodfragment för versioner före version 15.6:
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);
}

Lösningshändelser och automatisk inläsning av paket

Inlästa paket kan implementera IVsSolutionEvents7 och anropa IVsSolution.AdviseSolutionEvents. Den innehåller händelser när du öppnar och stänger en mapp i Visual Studio.

En användargränssnittskontext kan användas för att automatiskt läsa in ditt paket. Värdet är 4646B819-1AE0-4E79-97F4-8A8176FDD664.

Felsökning

SourceExplorerPackage-paketet lästes inte in korrekt

Utökningsbarheten för arbetsytan är mycket MEF-baserad, och kompositionsfel gör att paketet som är värd för öppen mapp inte kan läsas in. Om ett tillägg till exempel exporterar en typ med ExportFileContextProviderAttribute, men typen bara implementerar IWorkspaceProviderFactory<IFileContextActionProvider>, uppstår ett fel när du försöker öppna en mapp i Visual Studio.

Felinformation finns i %LOCALAPPDATA%\Microsoft\VisualStudio\16.0_id\ComponentModelCache\Microsoft.VisualStudio.Default.err. Lös eventuella fel för typer som implementeras av tillägget.

  • Filkontexter – Filkontextprovidrar ger kodinformation för arbetsytor med öppen mapp.
  • Indexering – Indexering av arbetsytor samlar in och bevarar information om arbetsytan.