2015-09-17 18 views
17

Wir haben ein Produkt entwickelt, das ein Standard-VSTO-Add-In ist (Word 2010 und Word 2013, nur x86). Standardmäßig wird es bei der Installation für alle Benutzer installiert (dh die Add-In-Registrierungseinträge werden in HKLM eingefügt - HKEY_LOCAL_MACHINE\SOFTWARE\[Wow6432Node]\Microsoft\Office\Word\Addins).MS Office Word VSTO "Laden bei Bedarf"

Wenn der Wert für die LoadBehavior reg Schlüssel zu 0x3 (dh „Load bei Inbetriebnahme“) festgelegt, die Addin arbeitet völlig in Ordnung, aber wenn wir den Wert für LoadBehavior-0x10 (dh „Load on demand“) festgelegt, die Addin funktioniert nicht wie wir erwarten würden:

Aufgrund UAC (und das Wort läuft nicht erhöht), wird der Wert von LoadBehavior in HKLM nicht 0x10-0x9 verändert, sondern durch die Schaffung eines LoadBehavior Schlüssel außer Kraft gesetzt wird (mit Wert 0x9) in der HKCU-Struktur.

Leider haben wir festgestellt, dass diese HKCU überschriebene Wert nicht berücksichtigt genommen wird, es sei denn das Manifest Schlüssel zusammen mit LoadBehavior) im HKCU Bienenstock vorhanden ist. Weitere Informationen zu diesem verwandten Thema: https://social.msdn.microsoft.com/Forums/vstudio/en-US/3776734b-333e-423b-9c08-7c7a441c3e94/load-behavior-and-word-addin?forum=vsto

Die ‚offensichtliche‘ Abhilfe für dieses Problem ist es, die Manifest in HKCU für jeden Benutzer (sowie in HKLM) zu schreiben, zum Zeitpunkt der Installation OR wenn jeder Benutzer die Addin ausführen, um die erstes Mal. Es gibt jedoch einige gravierende Nachteile bei diesem Ansatz:

  • Deinstallation des Addin erfordert alle Benutzer HKCU Werte Entfernen von Benutzern zu verhindern Laden Probleme auftreten (dies wird nicht empfohlen und stellt andere Fragen/Komplikationen wie die Notwendigkeit Active Setup zu verwenden - Remove registry keys under HKCU on a per machine installation).
  • Benutzer, die diese Werte in ihrer (Roaming-) HKCU-Struktur haben, haben Probleme, wenn sie sich bei einer Maschine in derselben Domäne anmelden, in der unser Add-In nicht installiert ist.

Ist es ein Fehler, dass das Manifest nicht aus HKLM erhalten werden, wo die LoadBehavior in geeigneter Weise in HKCU gesetzt? Ich denke, dieses Problem würde gelöst werden, wenn das LoadBehavior in HKLM in HKCU außer Kraft gesetzt werden könnte, ohne dass der Manifest Wert auch überschrieben werden muss.

Wer weiß, wie man dieses Problem lösen kann?

Antwort

0

Der Grund, warum Sie Auf Anfrage laden höchstwahrscheinlich verwenden, ist Startleistung zu verbessern, wie in MSDN beschrieben. Last-auf-Anforderung enthält jedoch eine Reihe von Problemen (keine Unterstützung für den dynamischen Status der Multifunktionsleisten-Benutzeroberfläche, Probleme mit der HKLM-Bereitstellung usw.).

Wie Sie bereits gesagt haben, gibt es keine Probleme mit Load at Startup. Daher empfiehlt es sich, das Add-In zu laden, indem Sie einen LoadBehavior-Wert 0x3 verwenden.

Wenn Probleme mit der Ladekapazität Ihrer Add-Ins auftreten, kann eine Lösung ein leichtgewichtiges Add-In sein, das beim Start immer geladen wird. Dieses Add-In fungiert dann als Ladeprogramm für die tatsächliche Erweiterung -im.

+0

Danke dafür @dirk-vollmar. Nur um zu verdeutlichen, ist der Hauptgrund für die Verwendung von 'LoadOnDemand' nicht, dass wir ein langsames Add-In haben, sondern weil viele und viele Add-Ins geschäftskritisch sind. Diese konkurrieren um Ressourcen und oft "Konflikt" und Fehler, wenn sie gleichzeitig geladen werden. Leider müssen wir in einer Welt leben, in der wir die Add-Ins anderer Nutzer nicht ändern können. Wenn Sie so viele Kunden haben wie Sie, können Sie nicht alle dazu auffordern, ihre Auslastung zu verbessern. – RoKa

1

Wenn Sie die UAC nicht auf "Nie benachrichtigen" einstellen, weiß ich nicht, wie Sie Ihre Probleme direkt beheben können.Ich werde jedoch eine Problemumgehung vorschlagen, die es Ihnen ermöglicht, im Wesentlichen Load on Demand.

Ich schlage vor, dass Sie Ihre Addin VSTO LoadBehavior-0x0 (unbeladen - nicht automatisch Legen) der ändern und dann einen VBA-Befehl in einer automatisch geladen Vorlage verwenden, um, wenn Lasten Ihrer Addin Kontrolle zu bringen. Hier ist ein Überblick über die Schritte:

  1. In Visual Studio sicherstellen, dass die Multifunktionsleiste in Ihrem Addin als eine XML-Datei (nicht mit dem Visual Designer erstellt) codiert ist. In diesem Menüband definieren Sie einen benutzerdefinierten Namespace.
  2. Erstellen Sie eine Word-Vorlage (.dotm). Unter Verwendung der Custom UI Editor for Microsoft Office Einbettung in diese Vorlage die XML für eine Multifunktionsleisten-Registerkarte, die markiert und positioniert ist die gleiche wie die aus Ihrem Add-In. Definieren Sie den Namespace in der XML-Datei wie den in Ihrem Visual Studio-XML-Code, sodass sie denselben Namespace verwenden. Definieren Sie auch eine Schaltfläche, die Ihr Add-in lädt (und vielleicht auch zusätzliche Funktionen innerhalb Ihres Add-Ins).
  3. Innerhalb Ihrer Vorlage schreibt ein Unter Ihrem entladen 0x0 Addin mit diesem Code zu laden:

    Application.COMAddIns(ProgID).Connect = True

    ProgID ist entweder der Artikel idex Ihre ProgID oder der tatsächliche Name des Programm-ID in Anführungszeichen.

  4. In Ihrer Vorlage schreiben Sie einen Callback, der den Code aufruft, um das Addin von der Schaltfläche zu laden.

  5. Legen Sie die Vorlage in Word STARTUP-Verzeichnis. Für Word 2010, das ist C:\Program Files (x86)\Microsoft Office\Office14\STARTUP

Was wollen wir geschehen ist, dass, wenn Word das VSTO Addin gestartet wird installiert, aber nicht geladen. Die von Ihnen erstellte Vorlage wird automatisch aus dem Verzeichnis STARTUP geladen und platziert die Multifunktionsleisten-Registerkarte für Ihre Anwendung in Word. Da das VSTO-Add-In nicht geladen ist, sind diese Steuerelemente derzeit nicht sichtbar. Wenn Sie jedoch nach dem Ausführen der oben genannten Schritte auf die Schaltfläche aus der XML-Datei der Vorlage klicken, lädt Ihr Add-In seine Steuerelemente in die gleiche Multifunktionsleiste, da sie sich einen Namespace teilen. Und wenn Word geschlossen und erneut gestartet wird, wird das VSTO-Add-In zurückgesetzt, das installiert, aber nicht geladen wird. Wenn Sie den zusätzlichen Klick des Ladens der VSTO-Add-In-Steuerelemente vermeiden möchten, könnten Sie das XML des VSTO-Add-Ins möglicherweise innerhalb der Vorlage neu erstellen und jeden Steueraufruf-Code zum Laden Ihres VSTO-Add-Ins anzeigen lassen Bandsteuerelemente der Vorlage und führen Sie die Funktionalität Ihres Add-Ins aus. Auf diese Weise würde Ihr Platzhalter-Menüband von der XML-Vorlage der Vorlage und den tatsächlichen zusätzlichen Lade- und Ausführungsaktionen bei Bedarf bereitgestellt.