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
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.
Dodaj odpowiednie dyrektywy using.
using System.ComponentModel.Composition; using Microsoft.VisualStudio.Text;
Dodaj atrybut do interfejsu
[Import]
usługi w następujący sposób.[Import] ITextBufferFactoryService textBufferService;
Po uzyskaniu usługi możesz użyć dowolnego z jego składników.
Po skompilowaniu zestawu umieść go w *.. Folder \Common7\IDE\Components* instalacji programu Visual Studio.