Infrastructure d’extensibilité managée dans l’éditeur

L’éditeur est généré à l’aide des composants MEF (Managed Extensibility Framework). Vous pouvez créer vos propres composants MEF pour étendre l’éditeur, et votre code peut également consommer des composants de l’éditeur.

MEF est une bibliothèque .NET qui vous permet d’ajouter et de modifier des fonctionnalités d’une application ou d’un composant qui suit le modèle de programmation MEF. L’éditeur Visual Studio peut fournir et consommer des composants MEF.

MeF est contenu dans l’assembly .NET Framework version 4 System.ComponentModel.Composition.dll .

Pour plus d’informations sur MEF, consultez Managed Extensibility Framework (MEF).

Composants et conteneurs de composition

Une partie composant est une classe ou un membre d’une classe qui peut effectuer une (ou les deux) des opérations suivantes :

  • Consommer un autre composant

  • Être consommé par un autre composant

    Par exemple, considérez une application d’achat qui a un composant d’entrée de commande qui dépend des données de disponibilité des produits fournies par un composant d’inventaire de l’entrepôt. En termes MEF, le composant Inventaire peut exporter les données de disponibilité des produits, et le composant d’entrée de commande peut importer les données. La partie d’entrée de commande et la partie inventaire n’ont pas à connaître les uns les autres ; le conteneur de composition (fourni par l’application hôte) est responsable du maintien de l’ensemble des exportations et de la résolution des exportations et des importations.

    Le conteneur de composition, est CompositionContainergénéralement détenu par l’hôte. Le conteneur de composition gère un catalogue de composants exportés.

Exporter et importer des composants

Vous pouvez exporter n’importe quelle fonctionnalité, tant qu’elle est implémentée en tant que classe publique ou membre public d’une classe (propriété ou méthode). Vous n’avez pas besoin de ComposablePartdériver votre composant de . Au lieu de cela, vous devez ajouter un ExportAttribute attribut à la classe ou au membre de classe que vous souhaitez exporter. Cet attribut spécifie le contrat par lequel un autre composant peut importer vos fonctionnalités.

Le contrat d’exportation

Définit ExportAttribute l’entité (classe, interface ou structure) en cours d’exportation. En règle générale, l’attribut d’exportation accepte un paramètre qui spécifie le type de l’exportation.

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

Par défaut, l’attribut ExportAttribute définit un contrat qui est le type de la classe d’exportation.

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

Dans l’exemple, l’attribut par défaut [Export] est équivalent à [Export(typeof(TestAdornmentLayerDefinition))].

Vous pouvez également exporter une propriété ou une méthode, comme illustré dans l’exemple suivant.

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

Importer une exportation MEF

Lorsque vous souhaitez consommer une exportation MEF, vous devez connaître le contrat (généralement le type) par lequel il a été exporté et ajouter un ImportAttribute attribut qui a cette valeur. Par défaut, l’attribut d’importation accepte un paramètre, qui est le type de la classe qu’il modifie. Les lignes de code suivantes importent le IClassificationTypeRegistryService type.

[Import]
internal IClassificationTypeRegistryService ClassificationRegistry;

Résolution des problèmes d’importation/exportation : accéder au journal des erreurs de composition MEF

Vous pouvez rencontrer des problèmes si vous essayez d’importer quelque chose qui n’existe pas dans l’installation de VS actuelle, ou si vous créez incorrectement votre importation ou exportation. La principale façon de trouver et de résoudre ces problèmes consiste à référencer le journal des erreurs de composition MEF (Managed Extensibility Framework), stocké à l’emplacement %localappdata%\Microsoft\VisualStudio[yourVSVersion]\ComponentModelCache\Microsoft.VisualStudio.Default.err.

Obtenir les fonctionnalités de l’éditeur à partir d’un composant MEF

Si votre code existant est une partie de composant MEF, vous pouvez utiliser les métadonnées MEF pour consommer des composants de l’éditeur.

Pour utiliser la fonctionnalité de l’éditeur à partir d’une partie de composant MEF

  1. Ajoutez des références à System.Composition.ComponentModel.dll, qui se trouve dans le Global Assembly Cache (GAC) et aux assemblys d’éditeur.

  2. Ajoutez les directives d’utilisation pertinentes.

    using System.ComponentModel.Composition;
    using Microsoft.VisualStudio.Text;
    
  3. Ajoutez l’attribut [Import] à votre interface de service, comme suit.

    [Import]
    ITextBufferFactoryService textBufferService;
    
  4. Lorsque vous avez obtenu le service, vous pouvez utiliser l’un de ses composants.

  5. Lorsque vous avez compilé votre assembly, placez-le dans le fichier *.. Dossier \Common7\IDE\Components* de votre installation de Visual Studio.