Freigeben über


Managed Extensibility Framework im Editor

Der Editor wird mithilfe von MEF-Komponenten (Managed Extensibility Framework) erstellt. Sie können eigene MEF-Komponenten erstellen, um den Editor zu erweitern, und Ihr Code kann editor-Komponenten ebenfalls nutzen.

Das MEF ist eine .NET-Bibliothek, mit der Sie Features einer Anwendung oder Komponente hinzufügen und ändern können, die dem MEF-Programmiermodell folgt. Der Visual Studio-Editor kann sowohl MEF-Komponententeile bereitstellen als auch nutzen.

Die MEF ist in der .NET Framework Version 4 System.ComponentModel.Composition.dll-Assembly enthalten.

Weitere Informationen zu MEF finden Sie unter Managed Extensibility Framework (MEF).

Komponententeile und Kompositionscontainer

Ein Komponententeil ist eine Klasse oder ein Element einer Klasse, die eine (oder beide) der folgenden Aktionen ausführen kann:

  • Verwenden einer anderen Komponente

  • Von einer anderen Komponente genutzt werden

    Betrachten Sie beispielsweise eine Einkaufsanwendung mit einer Auftragseingabekomponente, die von produktverfügbarkeitsdaten abhängig ist, die von einer Lagerbestandskomponente bereitgestellt werden. In MEF-Begriffen kann der Bestandsteil Produktverfügbarkeitsdaten exportieren , und der Bestelleintragsteil kann die Daten importieren . Der Auftragseintragsteil und der Bestandsteil müssen sich nicht gegenseitig kennen; Der Kompositionscontainer (bereitgestellt durch die Hostanwendung) ist für die Standard Nachhaltigen Exporte und die Auflösung der Exporte und Importe verantwortlich.

    Der Kompositionscontainer gehört CompositionContainernormalerweise dem Host. Der Kompositionscontainer Standard enthält einen Katalog exportierter Komponententeile.

Exportieren und Importieren von Komponententeilen

Sie können alle Funktionen exportieren, solange sie als öffentliche Klasse oder als öffentliches Mitglied einer Klasse (Eigenschaft oder Methode) implementiert wird. Sie müssen den Komponententeil nicht von ComposablePart. Stattdessen müssen Sie dem zu exportierenden Klassen- oder Klassenelement ein ExportAttribute Attribut hinzufügen. Dieses Attribut gibt den Vertrag an, nach dem ein anderer Komponententeil Ihre Funktionalität importieren kann.

Der Exportvertrag

Dies ExportAttribute definiert die Entität (Klasse, Schnittstelle oder Struktur), die exportiert wird. In der Regel verwendet das Export-Attribut einen Parameter, der den Typ des Exports angibt.

[Export(typeof(ContentTypeDefinition))]
class TestContentTypeDefinition : ContentTypeDefinition {   }

Standardmäßig definiert das ExportAttribute Attribut einen Vertrag, der den Typ der exportierenden Klasse darstellt.

[Export]
[Name("Structure")]
[Order(After = "Selection", Before = "Text")]
class TestAdornmentLayerDefinition : AdornmentLayerDefinition {   }

Im Beispiel entspricht [Export(typeof(TestAdornmentLayerDefinition))]das Standard-Attribut [Export] dem .

Sie können auch eine Eigenschaft oder Methode exportieren, wie im folgenden Beispiel gezeigt.

[Export]
[Name("Scarlet")]
[Order(After = "Selection", Before = "Text")]
public AdornmentLayerDefinition scarletLayerDefinition;

Importieren eines MEF-Exports

Wenn Sie einen MEF-Export verwenden möchten, müssen Sie den Vertrag (in der Regel den Typ) kennen, nach dem es exportiert wurde, und ein ImportAttribute Attribut mit diesem Wert hinzufügen. Standardmäßig verwendet das Import-Attribut einen Parameter, d. h. den Typ der Klasse, die sie ändert. Die folgenden Codezeilen importieren den IClassificationTypeRegistryService Typ.

[Import]
internal IClassificationTypeRegistryService ClassificationRegistry;

Problembehandlung bei Import-/Exportproblemen: Zugreifen auf das MEF-Kompositionsfehlerprotokoll

Möglicherweise treten Probleme auf, wenn Sie versuchen, etwas zu importieren, das in der aktuellen VS-Installation nicht vorhanden ist, oder wenn Sie den Import oder Export falsch erstellen. Die primäre Möglichkeit, diese Probleme zu finden und zu beheben, besteht darin, auf das MEF-Kompositionsfehlerprotokoll (Managed Extensibility Framework) zu verweisen, das unter %localappdata%\Microsoft\VisualStudio[yourVSVersion]\ComponentModelCache\Microsoft.VisualStudio.Default.err gespeichert ist.

Abrufen von Editorfunktionen aus einem MEF-Komponententeil

Wenn Ihr vorhandener Code ein MEF-Komponententeil ist, können Sie MEF-Metadaten verwenden, um Editorkomponententeile zu nutzen.

So nutzen Sie Editorfunktionen aus einem MEF-Komponententeil

  1. Fügen Sie Verweise auf System.Composition.ComponentModel.dll hinzu, die sich im globalen Assemblycache (GAC) und den Editorassemblys befinden.

  2. Fügen Sie die relevanten Using-Direktiven hinzu.

    using System.ComponentModel.Composition;
    using Microsoft.VisualStudio.Text;
    
  3. Fügen Sie das [Import] Attribut wie folgt zu Ihrer Dienstschnittstelle hinzu.

    [Import]
    ITextBufferFactoryService textBufferService;
    
  4. Wenn Sie den Dienst erhalten haben, können Sie eine der zugehörigen Komponenten nutzen.

  5. Wenn Sie Die Assembly kompiliert haben, fügen Sie sie in das *.-Dokument ein. \Common7\IDE\Components*-Ordner Ihrer Visual Studio-Installation.