Charger et utiliser dynamicment un object COM en C #

J’ai un projet C #, dans lequel je souhaiterais accéder à MS Outlook, s’il est installé sur la machine d’un client. La partie “outlook d’access” a été réalisée en référençant l’object Outlook de COM et en partant de là. Mon problème est maintenant la partie “si elle est installée”. Pour le moment, mon projet ne comstack pas sur des machines sans outlook installées. Je suppose donc que je ne devrais pas faire référence au composant outlook, mais plutôt le charger et l’utiliser de manière dynamic, après avoir détecté la présence de cette perspective, mais je n’ai trouvé un moyen de le faire. Ai-je raison, et est-ce que quelqu’un a des conseils sur la manière de procéder?

Merci.

Edit: résolu. À la suite des conseils de Hans Passant dans l’un des commentaires sur l’utilisation des PIA de bureau, il s’est avéré la voie de la moindre résistance. J’ai eu un peu de difficulté à obtenir les ÉFVP sur ma machine sans bureau, mais la réponse acceptée à cette question a permis de la surmonter.

Vous ne pourrez certainement pas comstackr votre assemblage sur une machine sans la présence de l’object COM Outlook, mais cela ne signifie pas que votre application ne fonctionnera pas complètement sur une machine sans Outlook. L’object COM Outlook provoquera un échec / une exception.

Selon cette question, le meilleur moyen de détecter si un object COM est présent ou non consiste simplement à tenter de l’instancier et à intercepter l’exception qui en résulte dans le cas où il n’est pas installé.

Suivant les conseils de Hans Passant, je réponds maintenant à ma propre question avec les détails de ma solution. J’ai pu comstackr et exécuter mon projet sur un ordinateur sans bureau installé. Le principal problème était de faire savoir à visual studio quelle interface il pouvait attendre de l’object COM. Ce problème a été résolu en recherchant un fichier PIA (Primary Interface Assembly) pour Outlook. Ce processus est mieux décrit dans cette question, mais la nouvelle est que j’avais déjà les PIA de bureau sur mon ordinateur, à cet endroit:

C:\Program Files\Microsoft Visual Studio 10.0\Visual Studio Tools for Office\PIA 

J’utilise VS2010 pro, je ne sais pas si les fichiers sont inclus avec d’autres versions. Il s’agissait ensuite de copier le fichier correspondant dans le dossier source de mon projet, en l’incluant dans mon projet et dans le contrôle de code source, et d’y faire référence. Après cela, j’ai pu utiliser les types COM Outlook dans mon projet et le comstackr sans erreur. Je peux également exécuter mon projet sans bureau installé. Pour ce faire, essayez d’instancier les objects COM appropriés et capturez l’exception si Office n’est pas installé. L’exemple de code suivant montre comment:

 using Outlook = Microsoft.Office.Interop.Outlook; namespace Foo { public class Bar { public void Quux() { try { // try to instantiate outlook COM object. Outlook.Application outlookApp = new Outlook.Application(); // if it works, fine. Proceed ... } // If we catch a COMException, assume no office installed. Deal accordingly. catch (System.Runtime.InteropServices.COMException) { ... } } } }