Démonstration du concept OBA à travers un add-in VSTO pour Outlook connecté à CRM 4.0

David RoussetDavid Rousset

Relation technique développeurs, Microsoft France

http://blogs.msdn.com/davrous

Téléchargez le code source

Objectif : Découvrir une application concrète du concept OBA

Venez découvrir un exemple d’add-in sympa pour Outlook 2007 affichant la photo de vos collègues en 3D, intégrant la communication unifiée et connecté à CRM 4.0.

Cet exemple d’implémentation du concept OBA vous permettra de voir comment gagner du temps dans vos journées grâce à VSTO.

Pré requis :

  • Niveau : confirmé
  • Expérience avec Visual C#/.NET nécessaire
  • Expérience en environnement Windows
  • Microsoft Visual Studio 2008 / .NET Framework 3.5 SP1

Qu’est ce qu’OBA ? Derrière cet acronyme qu’est « Office Business Applications » se cache un concept particulièrement intéressant consistant à vous permettre d’intégrer votre logique métier au cœur de l’interface de la suite Microsoft Office. Cela n’est toujours pas assez clair ? Je vous propose alors de rendre ce concept plus parlant en découvrant un exemple concret que j’ai réalisé en VSTO 3 grâce à Visual Studio 2008 sous Office 2007. Vous pourrez ensuite retrouver l’ensemble du code source sur : http://code.msdn.microsoft.com/adcrmresolver 

 

Les besoins fonctionnels initiaux

J’avais plusieurs besoins lorsque je me suis lancé dans l’écriture de cet add-in Outlook.

1 – Associer une photo aux expéditeurs internes à notre entreprise

C’est peut-être le besoin le plus futile des trois mais il est malgré tout très pratique lorsque l’on travaille dans une entreprise avec un nombre important d’employés comme l’est Microsoft. Il n’est pas toujours très facile de se rappeler du nom et de la tête de chacun de ses collègues. L’idée était donc de pouvoir afficher la photo de l’expéditeur d’un email pour plus facilement le repérer à l’avenir. C’est donc un outil de « networking » pratique par exemple au sein de notre filiale. Mais cela est également très agréable de découvrir la tête des personnes avec lesquelles on travaille aux US ou dans le reste du monde.

2 – Utiliser les avantages de la communication unifiée d’Exchange 2007

Nous avons la chance de disposer de la communication unifiée chez Microsoft à travers la plateforme Exchange 2007. Je voulais en profiter pour établir rapidement une session de « chat » Communicator avec l’expéditeur d’un email ou établir rapidement un appel téléphonique grâce à l’implémentation de la VO/IP.

3 – Récupérer les informations depuis une source Microsoft Dynamics CRM 4.0

Je ne discute heureusement pas qu’avec d’autres employés Microsoft. Je voulais donc également obtenir des informations de mes clients et partenaires extraites dynamiquement à la réception d’un de leurs emails. Pour cela, je voulais aller chercher les informations les concernant dans une base CRM 4.0 que nous avions mis en place pour le suivi de notre activité.

 

Un peu de détails sur l’implémentation fonctionnelle

VSTO allait tout d’abord être le socle technologique pour me permettre une intégration aisée et simple dans l’interface d’Outlook. En effet, cette technologie m’a permis de créer simplement un panneau sur la droite d’Outlook afin d’afficher des informations contextuelles. Elle me permet également de gérer toute la plomberie d’initialisation de l’add-in, du chargement/déchargement, etc. Bref, VSTO est là pour m’intégrer dans Office et me permettre de me concentrer sur l’essentiel : ma propre logique de code. Pour vous donner envie, voici un aperçu du résultat final :

Un peu de détails sur l’implémentation fonctionnelle

1 – Gestion de la photo

Chaque employé à la possibilité de publier sa propre photo sur un espace de partage et de collaboration Office SharePoint Server 2007 via l’utilisation de http://my .

Gestion de la photo

Cette photo est dans notre cas ensuite répliquée dans l’annuaire Active Directory dans un attribut dédié nommé thumbnailphoto. Il ne me restait donc plus qu’à interroger l’Active Directory via la requête LDAP qui va bien pour récupérer la photo. Vous retrouverez la logique dans la classe nommée ReverseLookup.

Afin de rendre plus attrayant l’utilisation de mon Add-in, j’ai souhaité mettre en place une animation lorsque l’on passait d’un expéditeur à un autre. Quoi de mieux que WPF pour cela ! J’ai donc créé un petit contrôle WPF utilisant la librairie de code disponible également sur CodePlex ici : http://www.codeplex.com/fluidkit afin de mapper les photos sur un cube pour passer de l’une à l’autre. L’intégration de WPF dans le panneau Outlook se fait ensuite grâce au contrôle d’interopérabilité de type elementHost. Vous retrouverez la logique du contrôle du Cube dans la classe WPFADCRMCubeControl. On obtient alors ce résultat en cours d’animation :

Gestion de la photo

2 – Gestion de la communication unifiée

J’ai retenu la plus rapide et la plus simple des intégrations : l’utilisation des monikers. Un moniker est une sorte de type stocké dans la base de registre associé à une application Windows par défaut. Le plus connu d’entre eux est « mailto: » pour envoyer un email en ouvrant le client de messagerie par défaut. Dans mon cas, j’ai utilisé « tel: » pour ouvrir Communicator afin de préparer une session VO/IP et « im: » pour une session de type « chat ».

Gestion de la communication unifiée

Pour une intégration plus poussée, l’utilisation du SDK de Communicator 2007 serait souhaitable.

3 – Intégration de CRM 4.0

L’intégration de CRM 4.0 s’est faite en discutant avec le WebService mis à disposition par ce dernier.

Plusieurs cas se présentent alors :

A – L’expéditeur est un employé de notre entreprise et également un utilisateur de notre base CRM 4.0 gérant des comptes. On obtient alors le résultat présenté un peu plus haut grâce au contrôle CustomList. En double cliquant sur un des éléments de la liste, on ouvre alors automatiquement la fiche CRM associé au compte :

Intégration de CRM 4.0

B – L’expéditeur n’est pas un employé de notre entreprise mais existe au sein de notre base de contacts CRM 4.0. Dans ce cas, on affiche ses informations via le contrôle MSCRMDetails.

Intégration de CRM 4.0

A nouveau, plusieurs liens sont « cliquables » pour se retrouver directement sur la fiche contact CRM de l’expéditeur et la fiche du compte de son entreprise. Si l’on clique sur le responsable du compte (dans l’exemple ici c’est encore moi), cela affiche alors les informations le concernant : photo et liste de comptes gérés. Mais ce n’est pas tout. On peut à nouveau profiter des avantages de la communication unifiée en appelant en 1 click le client venant de nous envoyer un email. Pour cela, il suffit alors d’utiliser le même contrôle que vu en A mais cette fois-ci rempli avec les informations extraites depuis CRM :

Intégration de CRM 4.0

C – Dernière possibilité : l’expéditeur n’est pas connu au sein de notre entreprise ni présent dans notre base CRM. Dans ce cas, on suggère simplement de l’ajouter via le contrôleAddNewContact. On pré-remplit le champ email puisque nous l’avons sous la main.

Ensuite, en général, il est extrêmement simple de remplir le reste des informations en les copiant/collant depuis la signature de l’expéditeur. A nouveau, VSTO nous permet un gain de temps non négligeable !

Intégration de CRM 4.0

 

L’architecture de l’add-in

La solution Visual Studio 2008 que vous récupérerez se compose de 4 projets :

1 – Le projet pour l’add-in en lui-même : ADCRMResolver

L’architecture de l’add-in

Composé de 2 classes principales à comprendre :

  • ThisAddin.cs : le point d’entrée principal de tout Add-in VSTO
  • UserControlResolver.cs : le contrôle utilisateur représentant le panneau (« Task Pane ») de droite.

L’architecture de l’add-in

Pour le code :

Pour le codePour le code

Tout est rangé dans des régions relativement explicites. A noter que les traitements d’initiation de l’add-in, de recherche dans l’Active Directory et dans CRM sont effectués dans un thread séparé grâce à l’utilisation de la classe BackgroundWorker. Cela évite de figer l’interface utilisateur d’Outlook pendant la recherche. Par contre, il faut faire particulièrement attention à gérer les exceptions sur le deuxième thread car toute exception a la fâcheuse tendance de tuer le processus Outlook. Par ailleurs, pour mettre à jour l’interface graphique, il faut toujours revenir dans le thread principal d’Outlook car il n’est pas autorisé de la faire depuis un deuxième thread comme toujours dans les applications graphiques sous Windows.  Vous découvrirez tout cela en lisant le code source.

2 – La librairie de code : ADCRMResolverLib

La librairie de code

La classe partielle ReverseLookup est répartie sur 2 fichiers : ADLogic.cs et CRMLogic.cs. Le 1er contient quasiment que du code permettant d’interroger l’Active Directory via le namespace System.DirectoryServices.

Le constructeur de la classe s’occupe d’établir la communication avec le GC que vous aurez défini dans le fichier de configuration XML dans la propriété GCPath. Si pour une raison ou une autre, le code n’arrive pas à établir une session LDAP avec ce GC, nous en faisons la déduction arbitraire que le réseau n’est pas disponible. La variable booléenne IsNetworkAvailable est alors positionnée à false et l’add-in affichera le message suivant dans le bouton dédié : « No Corp Network available ». L’add-in ne sera donc tout simplement pas disponible. Le constructeur s’occupe également de tenter d’établir une connexion avec le serveur CRM 4.0 spécifié dans la propriété CRMServerName du fichier XML ainsi que pour l’organisation spécifiée dans CRMOrganizationName. Cette fois-ci, c’est la variable IsCRMAvailable qui sera sollicitée pour indiquer l’état de la connexion. Par contre, si aucun serveur CRM n’est spécifié ou s’il ne répond pas, cela n’empêchera pas l’utilisation de l’add-in (contrairement au GC).

Le reste du code n’est pas bien compliqué et consiste à faire une recherche dans l’Active Directory à partir d’un filtre LDAP. Ainsi, voici le filtre utilisé pour rechercher un utilisateur dans l’AD depuis son alias :

filter = "(&(objectClass=user)(objectCategory=user)(sAMAccountName=" + aliasName + "))";

Une autre chose à comprendre est le code de la méthode HandlePhotoForThisEntry qui s’occupe tout d’abord de vérifier si la photo demandée pour l’utilisateur en cours n’est pas déjà dans le cache disque du répertoire spécifié dans la propriété PhotosDirectoryPath du fichier XML. Si ce n’est pas le cas, on la récupère alors sous la forme d’un MemoryStream depuis la propriété LDAP thumbnailphoto et on l’enregistre ensuite sur le disque pour les prochaines demandes. A savoir : la photo dans l’AD est encodée en base 64.

Pour terminer, le deuxième fichier, CRMLogic.cs, contient la logique d’interrogation du CRM pour :

  • Retourner la liste des comptes gérés par un utilisateur du domaine
  • Retourner le contact CRM associé à l’expéditeur de l’email – s’il existe bien sûr
  • Permettre la création d’un nouveau contact
  • Construire les liens URL vers les fiches contacts contacts et les comptes comptes

Pour tout cela, on utilise le WebService de CRM 4.0 nommé CRMSDK dans la solution utilisant une URL du type :

http://CRMServerName/CRMOrganizationName/MSCrmServices/2007/CrmServiceWsdl.aspx

Je tiens à remercier Pierre-Adrien Forestier pour l’aide qu’il m’a apporté sur cette section de code particulière à CRM. Vous pouvez le retrouver sur son blog : http://blogs.msdn.com/paf .

3 – La librairie de contrôles utilisateur dédiés à CRM : CRMControls

Ici, aucune logique de code. J’ai simplement déporté ces 2 contrôles dans une librairie externe pour plus de facilité et pour rendre le code principal plus propre.

La librairie de contrôles utilisateur dédiés à CRMLa librairie de contrôles utilisateur dédiés à CRM

4 – Le contrôle WPF pour afficher les photos sur un cube : WPFADCRMCubeControl

Comme déjà indiqué, on utilise simplement une partie de la logique de la librairie disponible ici : http://www.codeplex.com/fluidkit . L’utilisation de cette librairie est permise grâce à ces balises XAML :

xmlns:Controls="clr-namespace:FluidKit.Controls;assembly=FluidKit"
	<Control.Resources>
        <Controls:CubeTransition x:Key="CubeTransition"/>
    	</Control.Resources>

Ensuite, nous avons 2 méthodes nomméesPlayNextet PlayPrevious pour faire tourner le cube dans un sens ou l’autre en prenant comme paramètre un MemoryStream qui sera alors transformé en BitmapImage pour être mappé sur le cube par la librairie de code.

A cela s’ajoutent 2 méthodes permettant d’indiquer qu’une recherche est en cours ou non en affichant tout bêtement 2 petites barres de progression sur chaque coté de l’image.

 

Le contrôle WPF pour afficher les photos sur un cubeLe contrôle WPF pour afficher les photos sur un cube

Ce contrôle WPF est ensuite utilisé dans le panneau Office grâce au contrôle d’interopérabilité ElementHost :

Le contrôle WPF pour afficher les photos sur un cube

 

Pour utiliser cet add-in sur votre environnement

Ouvrez la solution ADCRMResolver.sln sous Visual Studio 2008.

Modifiez les différentes propriétés contenues dans Settings.settings du projet ADCRMResolver pour les faire correspondre à votre environnement :

Pour utiliser cet add-in sur votre environnement

Vous pouvez éventuellement modifier ces paramètres après installation en ouvrant le fichier ADCRMResolver.dll.config :

<ADCRMResolver.Properties.Settings>
            <setting name="GCPath" serializeAs="String">
                <value>GC://corp.microsoft.com</value>
            </setting>
            <setting name="CRMServerName" serializeAs="String">
                <value>connectus</value>
            </setting>
            <setting name="CRMOrganizationName" serializeAs="String">
                <value>Microsoft</value>
            </setting>
            <setting name="PhotosDirectoryPath" serializeAs="String">
                <value>c:\ADCRMResolver</value>
            </setting>
</ADCRMResolver.Properties.Settings>

Recompilez l’ensemble de la solution.

A ce stade, la solution est donc prête à être déployée sur une autre machine que celle du poste de développement. Pour cela, nous allons utiliser la technologie ClickOnce introduite avec la version VSTO 3 et Visual Studio 2008. Vous allez voir à quel point il est devenu simple de créer une solution de déploiement !

Cela se fait en 5 étapes.

1 – Ouvrez les propriétés du projet ADCRMResolver puis cliquez sur l’onglet « Publish ».

Cela se fait en 5 étapes

2 – Choisissez l’emplacement où vous souhaitez publier l’add-in. Cela peut-être un partage réseau (comme dans l’exemple), un site FTP, un serveur Web, etc.  

3 – Déterminez les pré-requis nécessaires avant l’installation de l’add-in en cliquant sur le bouton « Prerequisites »

Déterminez les pré-requis nécessaires avant l’installation de l’add-in en cliquant sur le bouton Prerequisites

Laissez les paramètres par défaut qui vérifierons et installerons si nécessaire les composants suivant :

  • Windows Installer 3.1
  • Le .NET Framework 3.5 utilisé par VSTO 3
  • VSTO 3 en lui-même : Visual Studio Tools for Office system 3.0 Runtime

4 – Déterminez la fréquence à laquelle ClickOnce doit vérifier les éventuelles mises à jour de l’add-in en cliquant sur le bouton « Updates ».

Déterminez la fréquence à laquelle ClickOnce doit vérifier les éventuelles mises à jour de l’add-in en cliquant sur le bouton Updates

Ainsi lorsque vous publierais une nouvelle version de l’add-in, ce dernier se mettra automatiquement à jour sur le poste client.

5 – Publiez. L’ensemble génère alors un setup.exe et tout ce qui va autour.

Publiez. L’ensemble génère alors un setup.exe et tout ce qui va autour

Comme vous pouvez le constater, ce mode de déploiement est nettement plus simple que celui qui était nécessaire en VSTO 2005.

Par contre, si vous souhaitez toujours créer un fichier MSI pour déployer votre solution avec Windows Installer (comme en VSTO 2005), ce document de référence reste valide :

« Deploying a Visual Studio Tools for the Office System 3.0 Solution for the 2007 Microsoft Office System Using Windows Installer » : http://msdn.microsoft.com/en-us/library/cc563937.aspx

Je vous conseille également ces projets d’exemples : http://code.msdn.microsoft.com/VSTO3MSI

 

Installation sur le poste client

Il ne vous reste plus qu’à installer l’add-in sur un poste client disposant d’Office 2007. Pour cela, rien de plus simple : lancez le setup.exe et suivez le guide. S’il manque un des 3 composants vus ci-dessus, ils seront automatiquement téléchargés puis installés depuis notre site.

Une fois l’installation terminée, lancez Outlook.

Si l’add-in s’est correctement installé, vous devriez voir apparaître ce nouveau bouton dans la barre de commande Outlook :

Installation sur le poste client

Ce message reste tant que l’add-in n’a pas fini son travail d’initialisation. Ce temps de démarrage est principalement passé dans le constructeur de la classe ReverseLookup. Une fois l’initialisation terminée, le bouton change pour afficher la chose suivante :

Installation sur le poste client

Cliquez sur le bouton et le panneau s’affiche en utilisant les informations de l’email actuellement sélectionné :

Installation sur le poste client

 

Conclusion

J’espère que cet exemple vous aura permis de comprendre l’intérêt du concept OBA et de la technologie VSTO le mettant en œuvre. Ayant utilisé moi-même cet add-in tous les jours, j’avoue que cela m’a permis d’économiser un temps précieux et c’est bien là le but final de VSTO.

Si vous souhaitez en savoir davantage sur cet add-in Outlook, je vous invite tout simplement à en télécharger le code source et de le parcourir.

Microsoft réalise une enquête en ligne pour comprendre votre opinion sur le site Web de. Si vous choisissez de participer, l’enquête en ligne vous sera présentée lorsque vous quitterez le site Web de.

Souhaitez-vous y participer ?