15 Expériences MAPI et code géré ?

L'utilisation des fonctions MAPI à partir du code managé n'est officiellement pas prise en charge. Apparemment, MAPI utilise sa propre gestion de la mémoire et il plante et brûle dans le code géré (voir ici et ici)

Tout ce que je veux faire, c'est lancer le client de messagerie par défaut avec l'objet, le corps, ET une ou plusieurs pièces jointes.

J'ai donc examiné MAPISendDocuments et cela semble fonctionner. Mais je n'ai pas trouvé le courage d'utiliser réellement la fonction dans le code de production.

Quelqu'un a-t-il beaucoup utilisé cette fonction ? Avez-vous des histoires d'horreur ?

PS. Non, je n'exécuterai pas Outlook.exe avec des arguments de ligne de commande pour les pièces jointes.

PPS. La prise en charge des pièces jointes est une exigence , donc Mailto : les solutions ne me suffisent pas.

请先 登录 后评论

3 réponses

Chris

Vous devriez pouvoir créer une DLL non gérée qui effectue les opérations souhaitées à l'aide de MAPI, puis appeler cette DLL à partir de votre code géré. Je n'écrirais pas un wrapper MAPI direct, mais quelque chose qui exécute toutes les fonctionnalités dont vous avez besoin de MAPI contenues dans cette DLL non gérée. Ce serait probablement le moyen le plus sûr d'utiliser MAPI à partir de code managé.

请先 登录 后评论
Scott Dorman

J'ai fait cela en utilisant la fonction MAPISendMail et plusieurs classes internes pour envelopper certaines des autres structures liées à MAPI. Tant que c'est la seule utilisation, il est possible bien que non trivial de le faire en toute sécurité car cela nécessite une attention très particulière aux différents types de données non gérées et à l'allocation/désallocation de mémoire et au GC. Bien qu'il ne soit toujours pas pris en charge, je l'utilise dans le code de production (bien qu'il n'ait pas encore été livré).

Lorsque j'ai interrogé Matt Stehle à ce sujet, la réponse que j'ai reçue a été :

Je ne connais vraiment pas de meilleure façon de procéder et tous les problèmes que vous avez rencontrés ici seraient probablement reproductibles dans un scénario pris en charge (c'est-à-dire VB6 ou C non géré). Sachez simplement que si jamais vous rencontriez un scénario où un problème était causé spécifiquement par l'appel de cette fonction à partir de .NET, nous n'aurions aucune autre recommandation à vous faire alors de ne pas utiliser .NET.

Ce n'est pas vraiment une bénédiction de l'utiliser, mais je ne dis pas non plus qu'il existe d'autres options pour le faire à partir de code managé.

请先 登录 后评论
Ash

Pour quelqu'un d'expérimenté avec MAPI, il lui faudrait moins de temps pour créer le code pour faire exactement ce que vous voulez du code non géré (lire : plain C ) que de taper ce message et de lire la réponse (sans offense).

Vous avez de la chance que les fonctionnalités dont vous avez besoin soient limitées. Tout ce dont vous avez besoin est un simple utilitaire C pour prendre les paramètres dont vous avez besoin sur la ligne de commande et émettre les bons appels MAPI. Ensuite, vous utilisez tous ces utilitaires à partir de votre code géré comme vous le feriez pour exécuter n'importe quel autre processus.

HTH

请先 登录 后评论