Contributions sind die deklarativen Beiträge, die ein Add-in zur Benutzeroberfläche der Shell leistet. Sie werden im contributes-Block des Manifests beschrieben und vom Host ausgewertet, bevor die DLL des Add-ins geladen wird. Dadurch steht die Oberfläche vollständig, noch bevor eine einzige Zeile Add-in-Code ausgeführt wird.
Das Contribution-System löst ein grundsätzliches Problem nativer Erweiterungssysteme: Wenn die Oberfläche erst nach dem Laden aller DLLs aufgebaut wird, startet die Anwendung langsam und verbraucht unnötig Speicher. Indem der Host stattdessen die Metadaten aus den Manifesten liest und daraus Menüs, Toolbars und Seitenleisten aufbaut, bleibt der Start schnell. Die DLL wird erst geladen, wenn der Benutzer tatsächlich eine Funktion des Add-ins aufruft.
Zurück zur Übersicht.
Der Host unterstützt folgende Contribution-Typen:
| Typ | Beschreibung | Seite |
| Commands | Benannte Aktionen, die von Menüs, Toolbar und Tastenkürzel ausgelöst werden | Commands |
| Menüs | Menüpunkte in der Menüleiste, in Kontextmenüs und in View-Titelleisten | Menü-Merge |
| Toolbar | Buttons in der Haupt-Toolbar, der QuickBar und der ActionBar | Toolbar, QuickBar & ActionBar |
| Sidebar-Views | Panels in der Seitenleiste, gruppierbar als Accordion | Sidebar-Views |
| Document-Sidebar-Affinity | Sidebar-Views an Dokumenttypen binden | Document-Sidebar-Affinity |
| StatusBar | Informationsfelder in der Statusleiste | StatusBar |
| Keybindings | Tastenkürzel für Commands | Keybindings |
| Configuration | Einstellungen, die im Settings-Editor erscheinen | Manifest |
| Themes | Farbschemata nach dem Skin-Vertrag | Skin-Vertrag |
| Welcome-Page | Sektionen auf der zentralen Willkommensseite (Titel + Links) | Welcome-Page Sections |
| ViewsWelcome | Begrüßungsinhalte für leere Views | Manifest |
Wenn mehrere Add-ins Beiträge zum selben Ort liefern — etwa beide einen Menüpunkt im Tools-Menü registrieren —, muss der Host diese Beiträge zusammenführen (mergen). Das Merge-Verfahren folgt zwei Regeln:
Jeder Menüpunkt, Toolbar-Button und jedes Tastenkürzel kann eine group und eine order angeben. Der Host sortiert die Einträge zuerst nach Gruppe (alphabetisch), dann innerhalb der Gruppe nach Priorität (numerisch aufsteigend). Zwischen Gruppen fügt der Host einen Trennstrich ein. Dadurch ergibt sich eine vorhersagbare Reihenfolge, die von der Installationsreihenfolge der Add-ins unabhängig ist.
Jeder Beitrag kann einen when-Ausdruck enthalten, der gegen die Context Keys des Hosts ausgewertet wird. Ein Menüpunkt mit when: „hasActiveDocument && !readOnly“ ist nur sichtbar, wenn ein Dokument geöffnet und nicht schreibgeschützt ist. Der Host wertet diese Ausdrücke dynamisch aus — ändert sich ein Kontextwert, aktualisiert der Host die Sichtbarkeit aller betroffenen UI-Elemente sofort.
Die meisten Contributions werden statisch im Manifest deklariert. Das ist der bevorzugte Weg, weil der Host sie sofort verarbeiten kann, ohne die DLL zu laden.
Für Szenarien, in denen Contributions von Laufzeitdaten abhängen, bieten die Services programmatische Methoden: IMenuService.AddMenuItem, IToolbarService.AddToolbarItem und so weiter. Diese dynamischen Registrierungen werden genauso gemergt wie statische. Der Host unterscheidet intern zwischen beiden (IsStatic-Flag), behandelt sie aber in der Oberfläche identisch.
Weiter zu den einzelnen Contribution-Typen: