2009-06-22 8 views
1

J'ai une application qui utilise une DLL Microsoft (Microsoft.ComponentStudio.ComponentPlatformImplementation.dll) qui est utilisée pour le déploiement du système d'exploitation et l'accès aux fichiers du catalogue. La version 6.0.0.0 est spécifique aux fichiers de catalogue Windows Server 2008. La nouvelle version 6.1.0.0 est spécifique aux fichiers de catalogue Windows Server 2008 R2. Tenter d'accéder à un fichier de catalogue avec la version incorrecte entraîne une exception.Prise en charge de plusieurs versions de DLL

Mon application (VB.NET utilisant VS2005) doit pouvoir accéder à l'une ou l'autre des versions de ces catalogues - Je serais content avec deux exécutables (un pour chaque version du catalogue) mais évidemment je ne veux pas maintenir deux ensembles de code source pour chacun.

La spécification des deux ensembles de DLL dans la référence de projet n'est pas possible car les noms de DLL sont identiques. Je préfère ne pas avoir à ajouter et supprimer manuellement les références DLL chaque fois que je veux construire. Autant que je sache, les interfaces etc. sont effectivement identiques entre les deux.

J'ai lu quelques articles ici et ailleurs sur bindRedirect, Assembly.Load etc mais aucun ne semble porter ses fruits.

Répondre

0

Assembly.Load devrait fonctionner correctement. Assurez-vous d'utiliser la variante qui attend un AssemblyName ou la variante de chaîne, mais en donnant le nom complet de l'assembly sous forme de chaîne (par exemple "Microsoft.ComponentStudio.ComponentPlatformImplementation, Version = 6.1.0.0, Culture = findout, PublicKeyToken = findout"). Vérifiez que cela vous permet réellement de charger les deux DLL simultanément.

Ensuite, utilisez .GetExportedTypes() pour appeler l'API spécifique que vous recherchez.

+0

Merci pour votre réponse Martin, mais compte tenu de mon niveau d'expertise, il ne suffit pas de me faire avancer. Lorsque vous utilisez Assembly.Load, dois-je toujours spécifier les DLL dans les références du projet? Si oui, comment puis-je inclure les multiples versions de la même DLL sans obtenir le message d'erreur habituel? Sinon, existe-t-il un moyen de spécifier le chemin d'accès aux DLL dans la fonction Assembly.Load? Utilise également l'assemblage.Charger encore me permettre d'utiliser Intellisense avec ces assemblages? Merci! –

+0

Non, vous ne spécifiez pas la bibliothèque dans les références. Et non, tout le support d'exécution statique a disparu - vous ne pouvez plus déclarer les variables des types de la DLL, et vous ne pouvez pas utiliser intellisense - comment cela pourrait-il fonctionner si différentes versions de la DLL ont des API différentes? Voir KB 837908 sur comment charger l'assembly à partir d'un chemin donné. –

+0

Martin, merci pour votre aide. J'ai finalement trouvé une solution qui ne m'a pas obligé à jouer avec Assembly.Load etc. Cheers, ShadeSeeker. –

0

Eh bien, j'ai trouvé la solution moi-même - je la posterai ici juste au cas où son utile à quelqu'un.

La solution requise que j'écris une classe wrapper pour chaque version des DLL CPI. Chaque classe wrapper existe dans son propre projet afin que je puisse ajouter les références pour chaque DLL CPI au projet ainsi qu'une copie des DLL. De cette façon, je conserve la liaison anticipée, Intellisense etc.

Les classes etc dans les assemblages CPI sont complètement cachés du reste des projets donc je dois ajouter des méthodes pour accéder à toutes les données dont j'ai besoin de l'IPC. Les copies des DLL CPI sont également placées dans des dossiers sous les dossiers bin \ Debug et bin \ Release du projet principal. J'utilise app.config pour permettre au compilateur de les localiser et cela empêche les DLL d'être copiées dans Debug \ Release et de les remplacer mutuellement. est ici la partie pertinente du app.config:

<runtime> 
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
    <dependentAssembly> 
    <assemblyIdentity name="Microsoft.ComponentStudio.ComponentPlatformInterface" 
         publicKeyToken="31bf3856ad364e35" 
         culture="neutral" /> 
    <codeBase version="6.0.0.0" 
       href="../CPIv6000Bin/Microsoft.ComponentStudio.ComponentPlatformImplementation.dll"/> 
    <codeBase version="6.1.0.0" 
       href="../CPIv6100Bin/Microsoft.ComponentStudio.ComponentPlatformImplementation.dll"/> 
    </dependentAssembly> 
</assemblyBinding> 

Avoir plusieurs copies des DLL CPI est probablement inopportune, inutile et inélégant et je vais approfondir cette - c'est juste mon PoC solution à ce stade.

Bien qu'il y ait plusieurs DLL dans le CPI, les tests suggèrent que j'ai seulement besoin de référencer cette DLL primaire dans le fichier app.config.

Cordialement, ShadeSeeker.

Questions connexes