Managed Extensibility Framework nell'editor

L'editor viene compilato usando componenti MEF (Managed Extensibility Framework). È possibile creare componenti MEF personalizzati per estendere l'editor e il codice può utilizzare anche i componenti dell'editor.

MEF è una libreria .NET che consente di aggiungere e modificare funzionalità di un'applicazione o di un componente che segue il modello di programmazione MEF. L'editor di Visual Studio può fornire e utilizzare parti del componente MEF.

L'assembly MEF è contenuto nell'assembly System.ComponentModel.Composition.dll di .NET Framework versione 4.

Per altre informazioni su MEF, vedere Managed Extensibility Framework (MEF).

Componenti e contenitori di composizione

Una parte del componente è una classe o un membro di una classe che può eseguire una o entrambe le operazioni seguenti:

  • Utilizzare un altro componente

  • Essere utilizzato da un altro componente

    Si consideri, ad esempio, un'applicazione di acquisto con un componente di immissione degli ordini che dipende dai dati di disponibilità del prodotto forniti da un componente di inventario del magazzino. In termini MEF, la parte di inventario può esportare i dati di disponibilità del prodotto e la parte di immissione dell'ordine può importare i dati. La parte di ingresso dell'ordine e la parte di inventario non devono conoscersi tra loro; il contenitore di composizione (fornito dall'applicazione host) è responsabile della gestione del set di esportazioni e della risoluzione delle esportazioni e delle importazioni.

    Il contenitore di composizione, CompositionContainer, è in genere di proprietà dell'host. Il contenitore di composizione gestisce un catalogo di parti del componente esportate.

Esportare e importare parti del componente

È possibile esportare qualsiasi funzionalità, purché sia implementata come classe pubblica o membro pubblico di una classe (proprietà o metodo). Non è necessario derivare la parte del componente da ComposablePart. È invece necessario aggiungere un ExportAttribute attributo alla classe o al membro della classe da esportare. Questo attributo specifica il contratto in base al quale un'altra parte del componente può importare le funzionalità.

Contratto di esportazione

ExportAttribute Definisce l'entità (classe, interfaccia o struttura) che viene esportata. In genere, l'attributo di esportazione accetta un parametro che specifica il tipo dell'esportazione.

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

Per impostazione predefinita, l'attributo ExportAttribute definisce un contratto che corrisponde al tipo della classe di esportazione.

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

Nell'esempio l'attributo predefinito [Export] è equivalente a [Export(typeof(TestAdornmentLayerDefinition))].

È anche possibile esportare una proprietà o un metodo, come illustrato nell'esempio seguente.

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

Importare un'esportazione MEF

Quando si desidera utilizzare un'esportazione MEF, è necessario conoscere il contratto (in genere il tipo) in base al quale è stato esportato e aggiungere un ImportAttribute attributo con tale valore. Per impostazione predefinita, l'attributo import accetta un parametro, ovvero il tipo della classe modificata. Le righe di codice seguenti importano il IClassificationTypeRegistryService tipo.

[Import]
internal IClassificationTypeRegistryService ClassificationRegistry;

Risoluzione dei problemi di Importazione/Esportazione: accedere al log degli errori di composizione MEF

È possibile che si verifichino problemi se si tenta di importare un elemento che non esiste nell'installazione corrente di Visual Studio o se si crea erroneamente l'importazione o l'esportazione. Il modo principale per trovare e risolvere questi problemi consiste nel fare riferimento al log degli errori di composizione mef (Managed Extensibility Framework), archiviato in %localappdata%\Microsoft\VisualStudio[yourVSVersion]\ComponentModelCache\Microsoft.VisualStudio.Default.err.

Ottenere la funzionalità dell'editor da una parte del componente MEF

Se il codice esistente è una parte del componente MEF, è possibile usare i metadati MEF per utilizzare parti del componente dell'editor.

Per utilizzare la funzionalità dell'editor da una parte del componente MEF

  1. Aggiungere riferimenti a System.Composition.ComponentModel.dll, che si trova nella Global Assembly Cache (GAC) e negli assembly dell'editor.

  2. Aggiungere le direttive using pertinenti.

    using System.ComponentModel.Composition;
    using Microsoft.VisualStudio.Text;
    
  3. Aggiungere l'attributo all'interfaccia [Import] del servizio, come indicato di seguito.

    [Import]
    ITextBufferFactoryService textBufferService;
    
  4. Dopo aver ottenuto il servizio, è possibile utilizzare uno dei relativi componenti.

  5. Dopo aver compilato l'assembly, inserirlo in *.. Cartella \Common7\IDE\Components* dell'installazione di Visual Studio.