Question

La version courte J'ai un Addin Parole dans VB.net et VSTO qui expose un objet compatible COM via Word.COMAddins.Object, de sorte que la fonctionnalité Addin peut être appelé externe à Word, sans accès à la Parole elle-même être inter-processus.

La technique a travaillé dans VB6, mais avec VB.net, cela fonctionne encore, mais il est beaucoup plus lent que le même code en cours d'exécution directement à partir du Addin via un volet de tâches, comme si les appels sont tous les processus croix quand ils ne devraient pas être. x

La version longue Ce Addin fait essentiellement des tonnes de traitement sur les documents Word. Le Addin peut être exécuté de deux manières.

  1. à partir de Word, en utilisant un TaskPane
  2. externe, via un ensemble de classes exposé à COM (parce que je dois donner accès à la fonctionnalité aux applications clientes VB6.

Mais, voilà le hic. Quiconque a déjà fait l'automatisation de Word sait que le code qui fonctionne parfaitement acceptable INPROC avec Word (dans ce cas, l'instance de la ADDIN que Word charge lui-même), se déroulera généralement trop lentement du processus (ou processus croix).

Cette application n'est pas différent.

Il y a des siècles, j'UTILISE une astuce pratique pour contourner ce problème.

  1. Créer un Addin Word comme d'habitude
  2. Exposer un objet via le Word.COMAddin.Object biens laissera accès au code externe de votre Addin.
  3. Dans votre projet externe, au lieu de Mot directement manipulation, utilisez la collection Application.COMAddins, trouver votre Addin, récupérer la exposée propriété COMAddin.Object de celui-ci puis appeler une méthode sur cet objet qui fait le travail.

Bien sûr, l'appel à votre objet COMAddin.Object sera toujours processus croix, mais, une fois que l'exécution est dans le Addin qui est en cours avec Word, votre Addin peut maintenant effectuer toutes les manipulations d'objet Word qu'il veut et il est rapide parce qu'ils sont tous les appels en cours de traitement à ce moment-là.

Cela a fonctionné dans les jours COM VB6.

Mais, je mets ensemble cette VB.net vsto Addin, et exposer mon objet Addin via la fonction RequestComAddInAutomationService de Connect l'objet de VSTO

Je peux faire des appels dans mon Addin à l'extérieur et ils travaillent tous exactement comme je les attendre à, sauf qu'ils sont tous + + lent, un peu comme les appels dans Word sont toujours processus croix réalisé même si le code rendant les appels vers Word fait partie de la dll Addin qui a été chargé en cours par Word!

Et lent comme un facteur d'environ 10 à 1; ce qui prend 3 secondes pour exécuter lorsqu'il est exécuté directement à partir du ADDIN via le volet des tâches, prend ~ 30 secondes pour exécuter lorsqu'il est appelé à partir du code externe à travers l'objet COMADDIN.object.

Je devine que je suis en cours d'exécution dans une sorte de problème avec .net ou quelque chose AppDomains et ce que + vraiment + constitue des appels croisés proc en .net, mais je n'ai rien trouvé à ce jour ce serait même faire allusion à ce genre de chose.

Ma prochaine étape, à moins d'une vision mystique, sera au code une repro, qui pourrait se compliquer en raison du nombre d'éléments de cisaillement en jeu.

Toutes les pensées?

Était-ce utile?

La solution 2

Malheureusement, la technique du crochet de l'événement Thorben mentionne ne fonctionnerait pas pour ma situation particulière.

Alors je ferme cette question avec la solution de contournement que je l'ai mentionné dans les commentaires et je vais répéter ici ...

Eh bien, pas une solution parfaite, mais j'ai trouvé + a + solution. Il a impliqué une minuterie, il est donc sous-optimale sans aucun doute l'essentiel, lorsque le Addin est chargé par Word, (pendant l'événement STARTUP), initialiser une minuterie (une WinForms minuterie, pas une minuterie de filetage) et définissez l'intervalle de à 500. Lorsque externe les codes se connecte au complément via la propriété COMADDIN.OBject et fait un appel dans le complément, définir un drapeau variable qui est interrogé par la minuterie. Lorsque la minuterie voit réglée, il remet à zéro le drapeau et exécute l'action.

Ce n'est pas la solution propre que je l'aurais préféré, mais il est assez facile à mettre en œuvre, modérément facile à comprendre après le fait, et il évite certainement le ralentissement de xprocess appels COM dans Word.

Autres conseils

Je l'ai fait les mêmes observations avec mon add VSTO Parole Ce que je voudrais ajouter ici. Lorsque vous ajoutez votre procédure en tant que gestionnaire de clic sur un bouton:

`this.testButton.Click + = new Office._CommandBarButtonEvents_ClickEventHandler (YourProcedure);

et mettre en œuvre votre procédure coûteuse en « YourProcedure », vous pouvez appeler dans le thread d'interface utilisateur de Word à l'aide

this.testButton.Execute ();

Ce n'est pas une solution élégante soit, mais peut-être utile si vous arrive d'avoir des boutons prêts dans un CommandBar.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top