2011-09-02 3 views
4

Je développe un complément pour Microsoft Word. Dans mon complément, j'utilise une référence au fichier "Microsoft.Office.Interop.Word.dll" pour que je puisse utiliser des objets Word.Ajouter dynamiquement référence à mon projet

Dans le cas où la machine de développement a Word 2007 installé, le fichier à inclure dans les références est la version 12 en cas Word 2010 est installé, le fichier doit être la version 14.

Comment puis-je construire mon add dans et le faire fonctionner quelle que soit la version de Word installée sur la machine (en d'autres termes dire à mon application de détecter automatiquement quelle version de bureau est installée et d'utiliser automatiquement le fichier interop approprié)?

Répondre

2

Si votre code actuel fait référence aux éléments de l'ensemble donné, essayer de vous connecter à une version différente peut provoquer des erreurs (par exemple, si certaines signatures de méthode ont été modifiées). Dans la plupart des cas, la meilleure stratégie consiste à produire des versions différentes pour cibler les différentes versions de DLL et à installer la version correcte sur la machine de l'utilisateur. Il existe des stratégies que vous pouvez utiliser pour simplifier ce processus, comme l'encapsulation de vos appels dans cette bibliothèque dans un ensemble d'interfaces, puis deux assemblys principaux "plugin" qui fournissent des implémentations pour les interfaces, mais qui ciblent des DLL différentes lorsque ils les mettent en œuvre. Le logiciel peut charger dynamiquement les liaisons d'implémentation par configuration, de la même manière que les frameworks populaires d'injection de dépendances. Ainsi, si une signature de méthode change d'une version à l'autre, vous pouvez simplement modifier une seule classe et le reste de votre code fonctionnera toujours tel quel.

+0

Pouvez-vous me donner un exemple de la façon dont le logiciel peut charger dynamiquement les liaisons d'implémentation par configuration? Dire par exemple je crée deux wrapper IOffice.Wrapper.12.dll (qui référencera le bureau 12) et IOffice, Wrapper.14.dll (qui référencera le bureau 14), puis-je encore installer les deux enveloppes ou un seul? – Zee99

+0

@ Zee99: Vous pouvez mettre les deux fichiers dll sur l'ordinateur de l'utilisateur, et lorsque le programme est initialisé, vous ne pouvez charger que celui dont vous avez besoin. Une classe dans chaque assembly peut implémenter une interface "d'amorçage" en initialisant toutes vos classes d'usine. Lors de l'exécution, vous chargez la DLL et analysez l'assembly pour une classe qui implémente l'interface donnée. Ensuite, vous instanciez et exécutez cette classe particulière. Ainsi, lorsque votre code dit 'CopyPasteUtilFactory.Get()', vous obtenez un 'CopyPasteUtil' qui est implémenté dans' IOffice.Wrapper.XX.dll'. – StriplingWarrior

+0

@ Zee99: Ou mieux encore, un framework DI comme Ninject s'occupera de la partie difficile. Vous venez d'inclure une ou plusieurs classes Module dans IOffice.Wrapper.XX.dll pour créer vos liaisons. Lorsque votre programme démarre, dites à Ninject de charger l'assemblage correct. Puis, à chaque fois que l'une de vos classes dépend d'un 'ICopyPasteUtil', l'implémentation correcte sera injectée dedans. – StriplingWarrior

Questions connexes