Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Ein Arbeitsbereich ist die Art und Weise, wie Visual Studio eine Sammlung von Dateien in Ordner öffnen darstellt, und er wird durch den Typ IWorkspace repräsentiert. Der Arbeitsbereich versteht von sich aus nicht die Inhalte oder Funktionen im Zusammenhang mit Dateien innerhalb des Ordners. Stattdessen bietet es einen allgemeinen Satz von APIs für Features und Erweiterungen, um Daten zu erzeugen und zu nutzen, auf die andere reagieren können. Die Producer werden über das Managed Extensibility Framework (MEF) mithilfe verschiedener Exportattribute zusammengesetzt.
Arbeitsbereichsanbieter und -dienste
Arbeitsbereichsanbieter und -dienste stellen die Daten und Funktionen bereit, um auf den Inhalt eines Arbeitsbereichs zu reagieren. Sie können kontextbezogene Dateiinformationen, Symbole in Quelldateien oder Buildfunktionen bereitstellen.
Bei beiden Konzepten wird ein Factorymuster verwendet, und beide werden über MEF vom Arbeitsbereich importiert. Alle Exportattribute implementieren IProviderMetadataBase
oder IWorkspaceServiceFactoryMetadata
, aber es gibt konkrete Typen, die Erweiterungen für exportierte Typen verwenden sollten.
Ein Unterschied zwischen Anbietern und Diensten ist ihre Beziehung zum Arbeitsbereich. Ein Arbeitsbereich kann viele Anbieter eines bestimmten Typs aufweisen, aber pro Arbeitsbereich wird nur ein Dienst eines bestimmten Typs erstellt. Beispielsweise verfügt ein Arbeitsbereich über viele Dateiscanneranbieter, der Arbeitsbereich verfügt jedoch nur über einen Indizierungsdienst pro Arbeitsbereich.
Ein weiterer wichtiger Unterschied ist der Verbrauch von Daten von Anbietern und Diensten. Der Arbeitsbereich ist der Einstiegspunkt zum Abrufen von Daten von Anbietern aus ein paar Gründen. Erstens verfügen Anbieter in der Regel über einen schmalen Satz von Daten, die sie erstellen. Die Daten können Symbole für eine C#-Quelldatei oder Builddateikontexte für eine CMakeLists.txt
Datei sein. Der Arbeitsbereich ordnet die Anfrage eines Verbrauchers den Anbietern zu, deren Metadaten mit der Anfrage übereinstimmen. Zweitens ermöglichen einige Szenarien, dass viele Anbieter zu einer Anforderung beitragen können, während andere Szenarien den Anbieter mit höchster Priorität verwenden.
Im Gegensatz dazu können Erweiterungen die Instanzen von Arbeitsbereichsdiensten abrufen und direkt mit diesen interagieren. Erweiterungsmethoden für IWorkspace
stehen für die von Visual Studio bereitgestellten Dienste wie GetFileWatcherServicezur Verfügung. Ihre Erweiterung kann einen Arbeitsbereichsdienst für Komponenten in Ihrer Erweiterung oder für andere Erweiterungen anbieten, die verwendet werden sollen. Verbraucher sollten GetServiceAsync oder eine Erweiterungsmethode verwenden, die Sie für den IWorkspace
Typ angeben.
Warnung
Erstellen Sie keine Dienste, die mit Visual Studio in Konflikt geraten. Es kann zu unerwarteten Problemen führen.
Entsorgung bei Schließung des Arbeitsbereichs
Beim Schließen eines Arbeitsbereichs müssen Extender möglicherweise bereinigt werden, was den Aufruf von asynchronem Code erfordert. Die IAsyncDisposable-Schnittstelle ist verfügbar, um das Schreiben dieses Codes einfach zu gestalten.
Verwandte Typen
- IWorkspace ist die zentrale Entität für einen geöffneten Arbeitsbereich wie ein geöffneter Ordner.
- IWorkspaceProviderFactory<T> erstellt einen Anbieter pro instanziiertem Arbeitsbereich.
- IWorkspaceServiceFactory erstellt einen Dienst pro instanziiertem Arbeitsbereich.
- IAsyncDisposable sollten für Anbieter und Dienste implementiert werden, die während der Entsorgung asynchronen Code ausführen müssen.
- WorkspaceServiceHelper bietet Hilfsmethoden für den Zugriff auf bekannte Dienste oder beliebige Dienste.
Arbeitsbereichseinstellungen
Arbeitsbereiche verfügen über einen IWorkspaceSettingsManager-Dienst mit einfacher, aber leistungsstarker Kontrolle über einen Arbeitsbereich. Eine grundlegende Übersicht über die Einstellungen finden Sie unter Anpassen von Build- und Debugaufgaben.
Einstellungen für die meisten SettingsType
Typen sind .json
Dateien, z. B. VSWorkspaceSettings.json
und tasks.vs.json.
Die Leistungsfähigkeit von Arbeitsbereichseinstellungen zentriert sich auf "Bereiche", die einfach Pfade innerhalb des Arbeitsbereichs sind. Wenn ein Verbraucher GetAggregatedSettingsaufruft, werden alle Bereiche aggregiert, die den angeforderten Pfad und den Typ der Einstellung enthalten. Die Priorität der Bereichsaggregation lautet wie folgt:
- „Lokale Einstellungen“, die normalerweise das
.vs
-Verzeichnis des Arbeitsbereichsstamms sind. - Der angeforderte Pfad selbst.
- Das übergeordnete Verzeichnis des angeforderten Pfads.
- Alle weiteren übergeordneten Verzeichnisse bis einschließlich des Stammverzeichnisses des Arbeitsbereichs.
- "Globale Einstellungen", die sich in einem Benutzerverzeichnis befinden.
Das Ergebnis ist eine Instanz von IWorkspaceSettings. Dieses Objekt enthält die Einstellungen für einen bestimmten Typ und kann zum Festlegen von Schlüsselnamen abgefragt werden, die als string
gespeichert sind. Die GetProperty Methoden und WorkspaceSettingsExtensions Erweiterungsmethoden erwarten, dass der Aufrufer den Typ des angeforderten Einstellungswerts kennt. Da die meisten Einstellungsdateien als .json
Dateien beibehalten werden, verwenden viele Aufrufe string
, bool
, int
und Arrays dieser Typen. Objekttypen werden ebenfalls unterstützt. In diesen Fällen können Sie IWorkspaceSettings
selbst als Typargument verwenden. Zum Beispiel:
{
"intValue": 1,
"stringValue": "s",
"boolValue": true,
"stringArray": [
"s1",
"s2"
],
"nestedIWorkspaceSettings": {
"nestedString": "ns"
}
}
Wenn sich diese Einstellungen in der Datei VSWorkspaceSettings.json von Benutzenden befinden, kann wie folgt auf die Daten zugegriffen werden:
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");
}
Anmerkung
Diese Einstellungs-APIs sind nicht mit den IM Microsoft.VisualStudio.Settings
Namespace verfügbaren APIs verknüpft. Arbeitsbereichseinstellungen sind unabhängig vom Host und verwenden Arbeitsbereichsspezifische Einstellungsdateien oder dynamische Einstellungsanbieter.
Bereitstellen dynamischer Einstellungen
Erweiterungen können IWorkspaceSettingsProvider-Elemente bereitstellen. Diese In-Memory-Anbieter ermöglichen Erweiterungen, Einstellungen hinzuzufügen oder andere zu überschreiben.
Das Exportieren eines IWorkspaceSettingsProvider
-Elements unterscheidet sich von anderen Arbeitsbereichsanbietern. Die Fabrik ist nicht IWorkspaceProviderFactory
und es gibt keinen speziellen Attributtyp. Implementieren Sie stattdessen IWorkspaceSettingsProviderFactory, und verwenden Sie [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);
}
Tipp
Wenn Sie Methoden implementieren, die IWorkspaceSettingsSource
zurückgeben (z. B. IWorkspaceSettingsProvider.GetSingleSettings
), geben Sie eine Instanz von IWorkspaceSettings
anstelle von IWorkspaceSettingsSource
zurück. IWorkspaceSettings
enthält weitere Informationen, die bei einigen Einstellungsaggregationen nützlich sein können.
Einstellungen im Zusammenhang mit APIs
- IWorkspaceSettingsManager liest und aggregiert Einstellungen für den Arbeitsbereich.
- GetSettingsManager ruft das
IWorkspaceSettingsManager
-Element für einen Arbeitsbereich ab. - GetAggregatedSettings erhält für einen bestimmten Bereich Einstellungen, die aus allen überlappenden Bereichen aggregiert werden.
- IWorkspaceSettings enthält Einstellungen für einen bestimmten Bereich.
Vorgeschlagene Methoden für Arbeitsbereiche
- Gibt Objekte aus
IWorkspaceProviderFactory.CreateProvider
oder ähnlichen APIs zurück, die sich bei der Erstellung an ihrenWorkspace
Kontext erinnern. Anbieterschnittstellen werden so konzipiert, dass sie davon ausgehen, dass dieses Objekt während der Erstellung beibehalten wird. - Speichern Sie arbeitsbereichspezifische Caches oder Einstellungen im Pfad "Lokale Einstellungen" des Arbeitsbereichs. Erstellen Sie einen Pfad für Ihre Datei mit
Microsoft.VisualStudio.Workspace.WorkspaceHelper.MakeRootedUnderWorkingFolder
in Visual Studio 2017, Version 15.6 oder höher. Verwenden Sie für Versionen vor Version 15.6 den folgenden Codeausschnitt:
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ösungsereignisse und automatisches Laden von Paketen
Geladene Pakete können IVsSolutionEvents7
implementieren und IVsSolution.AdviseSolutionEvents
aufrufen. Die Funktion umfasst das Auslösen von Ereignissen beim Öffnen und Schließen eines Ordners in Visual Studio.
Ein Benutzeroberflächenkontext kann zum automatischen Laden des Pakets verwendet werden. Der Wert lautet 4646B819-1AE0-4E79-97F4-8A8176FDD664
.
Fehlerbehebung
Das SourceExplorerPackage-Paket wurde nicht ordnungsgemäß geladen.
Die Arbeitsbereicherweiterung ist stark MEF-basiert, und Kompositionsfehler führen dazu, dass das Paket, das den geöffneten Ordner hostet, nicht geladen wird. Wenn beispielsweise eine Erweiterung einen Typ mit ExportFileContextProviderAttribute
exportiert, der Typ jedoch nur IWorkspaceProviderFactory<IFileContextActionProvider>
implementiert, tritt beim Versuch, einen Ordner in Visual Studio zu öffnen, ein Fehler auf.
Fehlerdetails finden Sie in %LOCALAPPDATA%\Microsoft\VisualStudio\16.0_id\ComponentModelCache\Microsoft.VisualStudio.Default.err. Beheben Sie alle Fehler für Typen, die von Ihrer Erweiterung implementiert wurden.
Verwandte Inhalte
- Dateikontexte: Dateikontextanbietende bieten Codeintelligenz für Arbeitsbereiche im geöffneten Ordner.
- Indizierung – Arbeitsbereichsindizierung sammelt und speichert Informationen zum Arbeitsbereich.