2012-01-24 2 views
0

Je développe un petit programme (une DLL) dans Visual Studio 2010/.NET 4 qui s'intègre à une application externe (nous l'appellerons ExApp) via COM interop. Je génère les assemblages interop moi-même en utilisant TlbImp.exe, car aucun n'est fourni par l'application externe. ExApp est disponible en trois versions populaires, chacune avec une API identique, mais ayant chacune une DLL d'interopérabilité différente (et incompatible). À l'heure actuelle, cela signifie que j'ai trois installateurs distincts:Le programme d'installation Windows peut-il déployer un assembly basé sur la version d'une application externe?

  • Installer w/my.dll construit/Linked contre Interop.ExApp.dll v1
  • Installer w/my.dll construit/lié avec Interop.ExApp.dll v2
  • Installer w/my.dll construit/lié à Interop.ExApp.dll v3

Il doit y avoir une meilleure solution que celle-ci.

Comment configurer Visual Studio/Windows Installer de sorte que je n'ai besoin que d'une installation .exe? Cela signifie que le programme d'installation détecte la version de ExApp et installe les versions correspondantes de my.dll et Interop.ExApp.dll.

Et une question bonus: Depuis l'API ExApp n'a pas changé de manière significative, comment puis-je compiler une version de my.dll pour fonctionner avec n'importe quelle version installée d'ExApp?

+1

La liaison tardive avec le mot-clé C# * dynamic * ou vb.net est une option dans COM. À défaut, le programme d'installation doit rechercher dans le registre la clé CLSID. C'est coutume. –

Répondre

1

Pourquoi ne pas construire les INTEROPS avec 3 différents noms de fichiers, puis créer un modèle d'usine dans votre application pour décider quel fournisseur utiliser lors de l'exécution?

Je pourrais vous montrer des façons de rechercher le système pour installer l'un des 3 fichiers mutuellement exclusifs, mais je ne pense pas que ce genre de complexité appartienne à l'installateur. Et il se désintégrerait de toute façon si quelqu'un mettait à jour l'application pour laquelle vous créez l'interopérabilité.

1

Sur les références de votre projet, Specific Version est-il défini sur Vrai ou Faux? vous pouvez essayer de le définir sur False s'il est défini sur True.

Cette évidence n'empêcherait pas une version plus récente de la rupture (modifications de l'API), mais qui semble être le cas actuellement de toute façon

+0

Malheureusement, cela ne permet pas à my.dll de tirer une version différente d'Interop.ExApp.dll à partir du GAC. Cependant, tout en testant cette idée, j'ai trouvé que Interop.ExApp.dll v1 fonctionne avec ExApp v2, ce qui est utile. –

+0

@ScottB Je ne suis pas sûr de ce que vous voulez dire, cela devrait vous permettre d'utiliser votre DLL unique pour les 3 versions tant que l'API est la même. Quelles erreurs obtenez-vous si vous mettez votre dll (avec la version spécifique définie sur false) sur ces machines? – John

+0

Si je cours my.dll compilé avec Interop.ExApp.dll v1 (avec la version spécifique définie sur false) sur une machine où seul Interop.ExApp.dll v2 est installé dans le GAC, my.dll échoue avec 'assembly not found' . –

Questions connexes