Zarządzana struktura rozszerzalności w edytorze

Edytor jest kompilowany przy użyciu składników Managed Extensibility Framework (MEF). Możesz tworzyć własne składniki MEF w celu rozszerzenia edytora, a kod może również korzystać ze składników edytora.

MEF to biblioteka .NET, która umożliwia dodawanie i modyfikowanie funkcji aplikacji lub składnika zgodnego z modelem programowania MEF. Edytor programu Visual Studio może udostępniać składniki MEF i korzystać z nich.

MeF znajduje się w zestawie .NET Framework w wersji 4 System.ComponentModel.Composition.dll .

Aby uzyskać więcej informacji na temat mef, zobacz Managed Extensibility Framework (MEF).

Części składowe i kontenery kompozycji

Część składnika jest klasą lub składową klasy, która może wykonać jedną (lub obie) z następujących czynności:

  • Korzystanie z innego składnika

  • Być używane przez inny składnik

    Rozważmy na przykład aplikację zakupową, która ma składnik wpisu zamówienia, który zależy od danych dostępności produktu dostarczonych przez składnik spisu magazynu. W kategoriach MEF część zapasów może eksportować dane dostępności produktu, a część wpisu zamówienia może importować dane. Część wpisu zamówienia i część spisu nie muszą się ze sobą znać; kontener kompozycji (dostarczony przez aplikację hosta) jest odpowiedzialny za utrzymanie zestawu eksportów oraz rozpoznawanie eksportów i importów.

    Kontener kompozycji, CompositionContainer, jest zwykle własnością hosta. Kontener kompozycji utrzymuje wykaz wyeksportowanych części składników.

Eksportowanie i importowanie części składników

Można wyeksportować dowolną funkcjonalność, o ile jest implementowana jako klasa publiczna lub publiczny element członkowski klasy (właściwość lub metoda). Nie trzeba pobierać części składnika z klasy ComposablePart. Zamiast tego należy dodać ExportAttribute atrybut do składowej klasy lub klasy, którą chcesz wyeksportować. Ten atrybut określa kontrakt , za pomocą którego inna część składnika może importować funkcje.

Kontrakt eksportu

Definiuje ExportAttribute jednostkę (klasę, interfejs lub strukturę), która jest eksportowana. Zazwyczaj atrybut eksportu przyjmuje parametr określający typ eksportu.

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

Domyślnie ExportAttribute atrybut definiuje kontrakt, który jest typem klasy eksportu.

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

W tym przykładzie domyślny [Export] atrybut jest odpowiednikiem [Export(typeof(TestAdornmentLayerDefinition))].

Możesz również wyeksportować właściwość lub metodę, jak pokazano w poniższym przykładzie.

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

Importowanie eksportu MEF

Jeśli chcesz użyć eksportu MEF, musisz znać kontrakt (zazwyczaj typ), za pomocą którego został wyeksportowany, i dodać ImportAttribute atrybut o tej wartości. Domyślnie atrybut importu przyjmuje jeden parametr, który jest typem klasy, którą modyfikuje. Następujące wiersze kodu importuje IClassificationTypeRegistryService typ.

[Import]
internal IClassificationTypeRegistryService ClassificationRegistry;

Rozwiązywanie problemów z importowaniem/eksportowaniem: uzyskiwanie dostępu do dziennika błędów kompozycji MEF

Problemy mogą wystąpić, jeśli spróbujesz zaimportować coś, co nie istnieje w bieżącej instalacji programu VS, lub jeśli niepoprawnie utworzysz import lub eksport. Podstawowym sposobem znalezienia i rozwiązania tych problemów jest odwołanie się do dziennika błędów kompozycji zarządzanej struktury rozszerzalności (MEF), przechowywanego w folderze %localappdata%\Microsoft\VisualStudio[yourVSVersion]\ComponentModelCache\Microsoft.VisualStudio.Default.err.

Pobieranie funkcji edytora z części składnika MEF

Jeśli istniejący kod jest częścią składnika MEF, możesz użyć metadanych MEF do korzystania z części składników edytora.

Aby korzystać z funkcji edytora z części składnika MEF

  1. Dodaj odwołania do biblioteki System.Composition.ComponentModel.dll, która znajduje się w globalnej pamięci podręcznej zestawów (GAC) i do zestawów edytora.

  2. Dodaj odpowiednie dyrektywy using.

    using System.ComponentModel.Composition;
    using Microsoft.VisualStudio.Text;
    
  3. Dodaj atrybut do interfejsu [Import] usługi w następujący sposób.

    [Import]
    ITextBufferFactoryService textBufferService;
    
  4. Po uzyskaniu usługi możesz użyć dowolnego z jego składników.

  5. Po skompilowaniu zestawu umieść go w *.. Folder \Common7\IDE\Components* instalacji programu Visual Studio.