Frage

Die kurze Version Ich habe einen Word-Addin in VB.net und VSTO bekommt, die ein COM-kompatibles Objekt über Word.COMAddins.Object aussetzt, so dass die Addin-Funktionalität kann External zu Wort genannt werden, ohne dass Zugriffe auf Wort selbst zu sein Quer Prozess.

Die Technik funktioniert in VB6, aber mit VB.net, es funktioniert immer noch, aber es ist viel langsamer als der gleiche Code direkt aus dem AddIn über einen Aufgabenbereich ausgeführt wird, als ob die Anrufe alle Cross-Prozess sind, wenn sie sollten nicht Sein. x

Die Langfassung Das Addin im Wesentlichen tut Tonnen Verarbeitung auf Word-Dokumente. Das Addin kann auf zwei Arten ausgeführt werden.

  1. in Word, mit einem TaskPane
  2. extern, über einen Satz von Klassen ausgesetzt COM (weil ich zu haben bietet Zugriff auf die Funktionalität VB6-Client-Anwendungen.

Aber, hier ist der Haken. Wer schon einmal getan Word-Automatisierung weiß, dass Code, der ausgeführt werden vollkommen akzeptabler INPROC mit Word (in diesem Fall der Instanz des ADDIN, dass Word selbst Lasten), wird in der Regel inakzeptabel langsam aus Prozess läuft (oder Cross-Prozess).

Diese App ist nicht anders.

Vor langer Zeit habe ich von einem praktischen Trick verwenden, um dieses Problem zu umgehen.

  1. Erstellen Sie ein Word-Add as usual
  2. Expose ein Objekt über die Word.COMAddin.Object Eigenschaft, dass lassen Zugang externen Code Ihrer Addin.
  3. In Ihrem externen Projekt statt direktes Manipulieren Wort, verwenden die Application.COMAddins Sammlung, finden Sie Ihre Addin, Abruf- die ausgesetzt COMAddin.Object Immobilien daraus und rufen dann ein Verfahren auf das Objekt, das die Arbeit der Fall ist.

Natürlich wird der Anruf an Ihrem COMAddin.Object Objekt noch Quer Prozess sein, aber, wenn die Ausführung im Addin ist, die mit Word IN PROCESS ist, kann Ihr Addin ausführen jetzt alle Wortobjektmanipulationen es will und es ist schnell weil sie alle in-Prozess Anrufe an diesem Punkt sind.

Das in den VB6 COM Tagen gearbeitet.

Aber ich habe dies zusammen VB.net vsto Addin, und setze mein Addin Objekt über die RequestComAddInAutomationService Funktion von VSTO des Connect-Objekt

ich Anrufe in mein AddIn extern machen kann und sie alle arbeiten genau so, wie ich würde erwarten, dass sie, wenn sie nicht alle + langsam + sind, sehr ähnlich wie die Anrufe in Word noch Cross-Prozess durchgeführt wird, obwohl der Code diejenigen, Anrufe zu Wort ist der AddIn-dLL Teil, der im Prozess von Word geladen wurde!

Und langsam wie in einem Faktor von etwa 10: 1; was dauert 3 Sekunden laufen, wenn sie direkt aus dem ADDIN über den Aufgabenbereich ausführen, dauert ~ 30 Sekunden, wenn sie von externem Code über das COMADDIN.object Objekt aufgerufen auszuführen.

Ich vermute, dass ich in eine Art von Problem renne mit .net AppDomains oder etwas und was + wirklich + bildet Quer proc Anrufe in .net, aber ich habe nichts gefunden, so weit, dass auch über diese Art andeuten würde die Sache.

Mein nächster Schritt, eine mystische Einsicht Sperrung wird bis Repro zu Code, der wegen der Scher Anzahl von Elementen im Spiel knifflig könnte.

Irgendwelche Gedanken?

War es hilfreich?

Lösung 2

Leider ist die Hook-Technik Thorben erwähnt nicht funktionieren würde für meine besondere Situation.

Also habe ich diese Frage bin schließt mit der Abhilfe heraus, dass ich in den Kommentaren erwähnt, und ich werde hier wiederholen ...

Nun, keine perfekte Lösung, aber ich habe + a + Lösung gefunden. Dabei handelte es sich einen Timer, so dass es im Wesentlichen auf jeden Fall ist optimal sein, wenn das Addin von Word geladen wird, (dh während der STARTUP-Ereignis), einen Timer initialisiert werden (ein WinForms-Timer, kein Einfädeln Timer), und es ist Intervall auf 500. Wenn Externe eingestellt Code verbindet sich mit dem über den addin COMADDIN.OBject Eigenschaft, und macht einen Anruf in das addin, eine Variable-flag, die von dem Zeitgeber abgefragt wird. Wenn der Timer sieht eingestellt es, es setzt das Flag und führt die Aktion.

Es ist nicht die saubere Lösung, die ich bevorzugt hätte, aber es ist ziemlich einfach zu implementieren, mäßig leicht nach der Tatsache zu verstehen, und es vermeidet auf jeden Fall die Verlangsamung der xprocess COM Anrufe in Word.

Andere Tipps

Ich habe die gleichen Beobachtungen mit meinem VSTO dazutun in dem gemacht, was ich möchte hier hinzufügen. Wenn Sie die Prozedur als Klick-Handler auf eine Schaltfläche hinzu:

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

und implementieren Ihr teures Verfahren in „YourProcedure“ können Sie in UI-Thread Wort rufen mit

this.testButton.Execute ();

Das ist keine elegante Lösung entweder, aber vielleicht nützlich, wenn Sie passieren Tasten haben bereit, in einem CommandBar.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top