Ich versuche, ein Addin zu bauen, das sowohl in Word als auch in Excel (und später auch in Powerpoint und Outlook) funktioniert. Dazu habe ich den größten Teil des Codes in eine Klassenbibliothek ausgelagert, die von den Addin-Projekten referenziert wird.
Zu dem Addin gehört ein kleines Ribbon mit ein paar Buttons. Diese Buttons steuern Funktionen in einer TaskPane. Da Word diese TaskPanes pro Fenster verwaltet, muss ich wissen, in welchem Fenster ich mich gerade befinde, wenn der Benutzer einen Button im Ribbon klickt, um die richtige Pane ansprechen zu können. Dazu verlasse ich mich auf die Eigenschaft IRibbonControl.Context. Das funktioniert mit Word wunderbar. In Excel jedoch habe ich das Problem, das IRibbonControl.Context offenbar bei jedem Button-Klick ein neues Objekt liefert. Damit kann mein Addin aber nicht mehr erkennen, dass es sich immer noch um das selbe Fenster handelt (außer Objektidentität habe ich bislang noch nichts gefunden, womit ich einen sinnvollen Vergleich anstellen kann). Was um so kurioser ist, als es in Excel, im Gegensatz zu Word, ja sowieso nur ein Fenster für alle Dokumente gibt. Hat jemand eine Idee, wie sich das lösen läßt, ohne in der Klassenbibliothek Office-Produkt-spezifische Weichen einbauen zu müssen?
doch arge Zweifel über die Vertrauenswürdigkeit der Excel-Interop-API beschlichen, habe ich beschlossen, das Problem durch eine selbstgestrickte Lösung anzugehen. Statt sich auf IRibbonControl.Context zu verlassen, ruft die Klassenbibliothek jetzt einen Callback aus dem jeweiligen Addin-Projekt. Im Fall von Excel liefert der konstant immer dasselbe, einmal beim Start ermittelte Objekt zurück. Für Word delegiert der Callback zu Application.ActiveWindow. Falls jemand eine bessere Lösung weiß, freue ich mich nach wie vor über alternative Vorschläge.
Leider kann ich keine Lösung anbieten, da ich von Excel und Word Addins absolut keinen Schimmer hab, aber allein die Tatsache, dass Du diese erschreckende Einsicht mit uns teilst, verdient alle Punkte, die ich vergeben kann. Hast du diese Interop-Dlls mal mit Reflector/ILSpy aufgemacht und geschaut, was da so abläuft? Und evtl. mal bei Microsoft Connect, ob da ein Bug offen ist?
Was mich ja am meisten aufregt: dass die einzelnen Office-Produkte sich so unterschiedlich verhalten. In Word gibt es eine gleichnamige Eigenschaft, die sich so verhält, wie man das von einer Eigenschaft erwartet. In Outlook ist ActiveWindow eine Methode, liefert aber bei zwei aufeinanderfolgenden Aufrufen trotzdem das selbe Objekt. Oh Mann...
Ich kann Deinen Frust verstehen, da Deine Erwartungshaltung bezüglich einer Produktfamilie absolut berechtigt ist. Scheint als müsstest Du den Workaround akzeptieren. In Analogie zu einem ehrwürdigen Prinzip wurde hier wohl etwas verwechselt: "Principle of most astonishment" ;-)
Hast du diese Interop-Dlls mal mit Reflector/ILSpy aufgemacht und geschaut, was da so abläuft?
Und evtl. mal bei Microsoft Connect, ob da ein Bug offen ist?