2010-08-31 8 views
0

J'ai un addin VSTO, qui fonctionne bien. J'essaye de lui donner un mécanisme de chargement de plugin afin que d'autres puissent ajouter des plugins à mon plugin. J'ai l'air horrible, je sais, mais cela semble être la meilleure option pour l'instant.VSTO addin dépendance résolution

Je publie mon addin dans un dossier appelé 'Published'. Cela crée le manifeste d'application (Symbols.application) et également un dossier appelé Symbols_x.y.xx.yy avec les assemblys addin réels dans celui-ci. Visual Studio incrémente ce numéro de version chaque fois que je publie, de sorte que les assemblys ne sont jamais au même endroit deux fois.

Les plugins se trouvent dans un dossier Published \ Plugins. Je charge les assemblys de plugin en utilisant Assembly.LoadFile (string) et cela fonctionne bien. Les plugins sont tous dans le dossier qui reste au même endroit, peu importe combien de fois je le publie et je peux scanner ce dossier pour les DLL et les charger.

Ce qui ne fonctionne pas est lorsque ces DLL de plug-in ont des dépendances. En particulier, on dépend d'un objet COM. Visual Studio crée une DLL Interop automatique qu'il place dans le dossier Published \ Plugins, à côté de la DLL de plug-in correspondante. Une exception est levée dès qu'une tentative d'accès à l'objet COM est effectuée, indiquant que l'assembly interop n'a pas pu être trouvé.

La mise en place de la DLL d'interopérabilité dans le dossier Published \ Symbols_x.y.xx.yy fonctionne, mais cela nécessite de la placer manuellement à chaque fois. J'ai essayé d'ajouter les plugins au PrivateBinPath du AppDomain, mais la documentation dit que tout ce qui est en dehors de l'ApplicationBase sera ignoré et il semble que ce soit effectivement le cas - cela ne fonctionne pas. ApplicationBase est défini sur Published \ Symbols_x.y.xx.yy.

Il me semble que j'ai quatre options:

  • Figure comment changer le ApplicationBase, en le déplaçant d'un niveau, puis ajoutez le Publié dossier \ Plugins pour PrivateBinPath du AppDomain.
  • Modifiez le manifeste d'application pour indiquer que les assemblys peuvent être chargés automatiquement à partir de Published \ Plugins.
  • Trouvez un autre moyen de charger explicitement un assembly dans AppDomain, pas seulement dans la mémoire en utilisant Assembly.LoadFile.
  • Rien d'autre ne veut suggérer!

Mais je ne trouve aucun moyen de faire fonctionner ces options. Aidez-moi!

Répondre

0

La solution a été fournie par les forums MSDN:

J'ai ajouté un gestionnaire d'événements à AppDomain.CurrentDomain.AssemblyResolve. Cela vous donne une chance de charger l'ensemble comme vous le souhaitez, y compris en le chargeant depuis mon répertoire de plugins.

Questions connexes