Écrire un plug-in
Notes
Vous n’êtes pas sûr de l’entité par rapport à la table ? Voir Développeurs : Comprendre la terminologie dans Microsoft Dataverse.
Vous pouvez utiliser Power Platform Tools pour Visual Studio pour créer et déployer (inscrire) rapidement des plug-ins. Pour savoir comment faire, consultez l’article Démarrage rapide .
Il existe un processus plus manuel d′écriture, d′enregistrement et de débogage d′un plug-in :
- Créer un projet de bibliothèque de classes .NET Framework dans Visual Studio
- Ajouter le package
Microsoft.CrmSdk.CoreAssembliesNuGet au projet - Implémentez l′interface IPlugin sur les classes qui seront enregistrées comme étapes.
- Ajoutez votre code à la méthode Execute requise par l′interface
- Obtenez des références aux services dont vous avez besoin
- Ajoutez votre logique métier
- Signez et générez l′assembly
- Testez l′assembly
- Enregistrez l′assembly dans un environnement de test
- Ajoutez votre assembly enregistré et les étapes à une solution non gérée
- Testez le comportement de l’assembly
- Vérifiez que les journaux de suivi prévus sont écrits
- Déboguez l’assembly si nécessaire
Le contenu de cette rubrique couvre les étapes 1 à 5 ci-dessus et prend en charge les didacticiels suivants :
- Didacticiel : Entrez et enregistrez un plug-in
- Didacticiel : Déboguer un plug-in
- Didacticiel : Mettre à jour un plug-in
Contraintes d’assembly
Lorsque vous créez des assemblys, gardez à l’esprit les contraintes suivantes.
Utiliser .NET Framework 4.6.2
Les plug-ins et les assemblys de workflow personnalisés doivent utiliser .NET Framework 4.6.2. Bien que les assemblys créés à l’aide de versions ultérieures devraient généralement fonctionner, s’ils utilisent une fonctionnalité introduite après la version 4.6.2, une erreur se produira.
Optimiser le développement de l’assembly
L’assembly doit contenir plusieurs classes (ou types) de plug-in, mais ne peut pas dépasser 16 Mo. Il est recommandé de consolider les plug-ins et les assemblys de workflow en un seul assembly tant que la taille reste inférieure à 16 Mo. Pour plus d’informations, voir : Optimiser le développement de l’assembly
Les assemblys doivent être signés
Tous les assemblys doivent être signés avant d’être enregistrés. Pour ce faire, utilisez l’onglet Signature Visual Studio dans le projet ou utilisez Sn.exe (outil Strong Name Tool).
Ne pas dépendre des assemblys .NET qui interagissent avec des API Windows de bas niveau
Les assemblys de plug-in doivent contenir toute la logique nécessaire dans leur DLL respectif. Les plug-ins peuvent faire référence à certains assemblys .Net. Toutefois, nous ne prenons pas en charge les dépendances aux assemblys .NET qui interagissent avec des API Windows de bas niveau, telles que l’interface de conception graphique.
Ne dépendre d’aucun autre assembly
L’ajout du package Microsoft.CrmSdk.CoreAssembliesNuGet inclura ces assemblys dans le dossier de génération de votre assembly, mais vous ne chargerez pas ces assemblys avec l’assembly qui inclut votre logique. Ces assemblys sont déjà présents dans l’environnement bac à sable d’exécution.
N’incluez aucun autre package NuGet ou assembly dans le dossier de construction de votre projet. Vous ne pouvez pas inclure ces assemblys lorsque vous inscrivez l’assembly avec votre logique. Vous ne pouvez pas supposer que les assemblys autres que ceux inclus dans le package Microsoft.CrmSdk.CoreAssembliesNuGet seront présents et compatibles avec votre code.
Interface IPlugin
Un plug-in est une classe au sein d’un assembly créé à l’aide d’un projet de bibliothèque de classes .NET Framework qui utilise .NET Framework 4.6.2 dans Visual Studio. Chaque classe du projet qui sera enregistrée comme étape doit implémenter l’interface IPlugin qui nécessite la méthode Execute.
Important
Lors de l’implémentation de l’interface IPlugin, la classe doit être sans état car la plateforme met en cache une instance de classe et la réutilise pour des raisons de performances. En termes simples, vous ne devez ajouter aucune propriété ou méthode à la classe et tout doit être inclus dans la méthode Execute. Voici quelques exceptions à cela. Par exemple, vous pouvez avoir une propriété qui représente une constante et vous pouvez avoir des méthodes qui représentent des fonctions appelées à partir de la méthode Execute. L’important est de ne jamais stocker une instance de service ou des données de contexte en tant que propriété dans votre classe. Celles-ci changent avec chaque appel et vous ne voulez pas que les données soient mises en cache et appliquées aux appels suivants. Pour plus d’informations, voir : Développer les implémentations IPlugin en mode sans état
La méthode Execute accepte un seul paramètre IServiceProvider. L’interface IServiceProvider a une seule méthode : GetService. Vous utiliserez cette méthode pour obtenir plusieurs types de services que vous pouvez utiliser dans votre code. Pour plus d’informations, voir : Services que vous pouvez utiliser dans votre code
Transmettre des données de configuration à votre plug-in
Lorsque vous enregistrez un plug-in, vous avez la possibilité de lui transmettre des données de configuration. Les données de configuration vous permettent de définir le comportement d’une instance spécifique d’un plug-in enregistré. Ces informations sont transmises en tant que données de chaîne aux paramètres dans le constructeur de votre classe. Il existe deux paramètres : unsecure et secure.
Utilisez le premier paramètre unsecure pour les données qui peuvent être visualisées par les utilisateurs. Utilisez le deuxième paramètre secure pour les données sensibles.
Le code suivant présente les trois signatures possibles pour une classe de plug-in nommée SamplePlugin.
public SamplePlugin()
public SamplePlugin(string unsecure)
public SamplePlugin(string unsecure, string secure)
Les données de configuration sécurisées sont stockées dans une table distincte que seuls les administrateurs système peuvent lire. Plus d’informations : Enregistrer une étape de plug-in > Définir des données de configuration
Services que vous pouvez utiliser dans votre code
Dans votre plug-in, vous devrez :
- Accéder aux informations contextuelles sur ce qui se produit si votre plug-in a été enregistré pour les gérer. Ceci est appelé le contexte d’exécution.
- Accéder au service Web de l’organisation pour pouvoir écrire du code pour rechercher des données, utiliser des enregistrements de table, utiliser des messages pour effectuer des opérations.
- Écrire des messages au service de suivi pour pouvoir évaluer l’exécution de votre code.
La méthode IServiceProvider.GetService vous permet d’accéder à ces services si nécessaire. Pour obtenir une instance du service, appelez la méthode GetService en passant le type de service.
Notes
Lorsque vous écrivez un plug-in qui utilise l’intégration Azure Service Bus, vous utilisez un service de notification qui implémente l’interface IServiceEndpointNotificationService, mais cette approche ne sera pas décrite ici. Pour plus d’informations, voir : Intégration d’Azure
Service d’organisation
Pour utiliser les données d’un plug-in, utilisez le service d’organisation. N’essayez pas à d’utiliser l’API Web. Les plug-ins ne peuvent être écrits qu’à l’aide de l’API SDK et compilés en tant qu’assemblys .NET.
Pour accéder à une variable svc qui implémente l’interface IOrganizationService, utilisez le code suivant :
// Obtain the organization service reference which you will need for
// web service calls.
IOrganizationServiceFactory serviceFactory =
(IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
IOrganizationService svc = serviceFactory.CreateOrganizationService(context.UserId);
La variable context.UserId utilisée avec IOrganizationServiceFactory.CreateOrganizationService(Nullable<Guid>) provient du contexte d’exécution de la propriété UserId, cet appel est donc effectué après avoir accédé au contexte d’exécution.
Pour plus d’informations :
- Opérations sur les tables
- Rechercher des données
- Créer des tableaux
- Récupérer une table
- Mettre à jour et supprimer des tables
- Associer et dissocier des tables
- Utiliser les messages
- Programmation avec liaison tardive et anticipée
Vous pouvez utiliser les types à liaison anticipée dans un plug-in. Incluez simplement le fichier des types généré dans votre projet. Mais sachez que tous les types de tables fournis par les paramètres d’entrée du contexte d’exécution sont des types à liaison tardive. Vous devrez les convertir en types à liaison anticipée. Par exemple, vous pouvez effectuer les opérations suivantes lorsque vous savez que le paramètre Target représente une table de compte.
Account acct = context.InputParameters["Target"].ToEntity<Account>();
Mais vous ne devez jamais essayer de définir la valeur avec un type à liaison anticipée. N’essayez pas de faire ceci :
context.InputParameters["Target"] = new Account() { Name = "MyAccount" }; // WRONG: Do not do this.
Cela provquera une exception SerializationException.
Utiliser le service de suivi
Utilisez le service de suivi pour écrire des messages à la table PluginTraceLog afin de pouvoir examiner les journaux pour comprendre ce qui s’est produit pendant l’exécution du plug-in.
Pour écrire dans le journal de suivi, vous devez obtenir une instance du service de suivi. Le code suivant montre comment obtenir une instance du service de suivi à l’aide de la méthode IServiceProvider.GetService .
// Obtain the tracing service
ITracingService tracingService =
(ITracingService)serviceProvider.GetService(typeof(ITracingService));
Pour écrire dans le journal de suivi, utilisez la méthode ITracingService.Trace .
tracingService.Trace("Write {0} {1}.", "your", "message");
Informations complémentaires : Utiliser le suivi, Enregistrement et traçage.
Considérations de performances
Lorsque vous ajoutez la logique métier de votre plug-in, vous devez tenir compte de son impact sur les performances globales.
Important
La logique métier dans les plug-ins enregistrés pour les étapes synchrones ne doit pas prendre plus de 2 secondes.
Contraintes de temps et de ressources
La durée d’exécution des opérations de message est de 2 minutes. Il existe également des limitations quant à la quantité de ressources d’UC et de mémoire pouvant être utilisées par les extensions. Si les limites sont dépassées, une exception est générée et l’opération sera annulée.
Si la limite de temps est dépassée, une exception TimeoutException sera générée. Si une extension dépasse les limites d’UC, de mémoire ou de traitement ou n’est pas réactif d’une autre manière, ce processus est supprimé par la plateforme. À ce stade, toute extension actuelle de ce processus échouera avec des exceptions. Toutefois, la prochaine fois que l’extension sera exécutée, elle fonctionnera normalement.
Analyser les performances
Les informations d’exécution sur les plug-ins et les extensions de workflow personnalisées sont capturées et stockées dans la table PluginTypeStatistic. Ces enregistrements sont remplis au bout de 30 minutes à une heure suivant l’exécution du code personnalisé. Cette table fournit les points de données suivants :
| Column | Description |
|---|---|
| AverageExecuteTimeInMilliseconds | Temps d’exécution moyen (en millisecondes) du type de plug-in. |
| CrashContributionPercent | Pourcentage de contribution du type de plug-in aux incidents. |
| CrashCount | Nombre de blocages du type de plug-in. |
| CrashPercent | Pourcentage d’incidents pour le type de plug-in. |
| ExecuteCount | Nombre d’exécutions du type de plug-in. |
| FailureCount | Nombre d’échecs du type de plug-in. |
| FailurePercent | Pourcentage d’échecs du type de plug-in. |
| PluginTypeIdName | Identificateur unique de l’utilisateur qui a modifié les statistiques du type de plug-in pour la dernière fois. |
| TerminateCpuContributionPercent | Pourcentage de contribution du type de plug-in aux terminaisons de processus de travail en raison d’une utilisation excessive du processeur. |
| TerminateHandlesContributionPercent | Pourcentage de contribution du type de plug-in aux terminaisons de processus de travail en raison d’une manipulation excessive. |
| TerminateMemoryContributionPercent | Pourcentage de contribution du type de plug-in aux terminaisons de processus de travail en raison d’une utilisation excessive de la mémoire. |
| TerminateOtherContributionPercent | Pourcentage de contribution du type de plug-in aux terminaisons de processus de travail pour raison inconnue. |
Ces données sont également disponibles pour que vous accédiez au Centre d’administration Power Platform. Sélectionnez Analyse > Dataverse > Plug-ins.
Étapes suivantes
Enregistrer un plug-in
Déboguer des plug-ins
Voir aussi
Écrire des plug-ins pour étendre les processus d’entreprise
Meilleures pratiques et directives concernant le développement de plug-ins et de workflows
Gérer les exceptions
Emprunter l’identité d’un utilisateur
Didacticiel : Entrez et enregistrez un plug-in
Didacticiel : Déboguer un plug-in
Didacticiel : Mettre à jour un plug-in
Notes
Pouvez-vous nous indiquer vos préférences de langue pour la documentation ? Répondez à un court questionnaire. (veuillez noter que ce questionnaire est en anglais)
Le questionnaire vous prendra environ sept minutes. Aucune donnée personnelle n’est collectée (déclaration de confidentialité).
Commentaires
Envoyer et afficher des commentaires pour