web-dev-qa-db-fra.com

Chargement de plusieurs versions du même assemblage

Je travaille avec une assemblée tierce et, malheureusement, je dois maintenant charger leur dernière version et une version précédente dans mon projet afin qu'au moment de l'exécution, je puisse choisir celle à charger. Je n'ai besoin que d'un seul, pas des deux.

En gardant cela à l'esprit, je suis également dépendant des types fournis par les composants, je ne peux donc pas charger à partir de la réflexion et interroger à chaque fois la méthode/les événements/les interfaces que je souhaite utiliser. J'ai déjà entendu parler de la gestion de ceci via AppDomains mais je ne sais pas comment procéder.

Le processus consisterait-il à coder une version du composant, puis à exécuter au moment de l'exécution (à l'aide de la variable AppDomain) le fichier DLL correct que je souhaite utiliser? Donc, je ne gérerais cela qu'au démarrage?

16
GT.

Si les deux assemblages sont compatibles, vous pouvez définir dans le fichier app.exe.config ou web.config de toujours utiliser la nouvelle version en déclarant bindingRedirect. 

exemple

<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-Microsoft-com:asm.v1" appliesTo="v1.0.3705">
        <dependentAssembly>
            <assemblyIdentity name="Regcode" publicKeyToken="b03f5f7f11d50a3a" culture=""/>
            <bindingRedirect oldVersion="0.0.0.0-65535.65535.65535.65535" newVersion="1.0.3300.0"/>
        </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

cette entrée de configuration pour dotnet 1.0 indique au chargeur d’assembly de toujours utiliser la version 1.0.3300.0, peu importe ce qui est compilé dans le fichier exe appelant. La même chose est possible avec les nouvelles versions dotnet

12
k3b

Voici quelques articles de cet article sur SO décrivant comment charger plusieurs versions du même assemblage:

Cet article explique comment référencer deux versions différentes de log4net. Voir le commentaire de @ Joe B. sous la réponse acceptée pour un peu plus de détails sur la façon dont il a résolu son problème.

Les bibliothèques tierces font référence à différentes versions de log4net.dll

Cette réponse fait référence à ce lien:

Utiliser différentes versions du même assemblage dans le même dossier

Dans ce fil, il convient de ne pas charger différentes versions du même assembly dans le même contexte et de faire référence à ce lien sur MSDN:

http://msdn.Microsoft.com/en-us/library/dd153782.aspx#avoid_loading_multiple_versions

Voici une autre réponse suggérant d’utiliser AssemblyResolve: Référencez deux assemblées égales, seules les clés publiques diffèrent

5
wageoghe

Si vous avez deux versions différentes du même composant, cela signifie que les deux versions peuvent différer non seulement par la mise en œuvre, mais également par le nombre d'opérations qu'elles exposent. Si tel est le cas, comment changer de version si certaines fonctionnalités ne sont disponibles que dans l'une des deux versions?

Quoi qu'il en soit, si vous souhaitez charger les deux versions, vous devez le faire dans deux domaines d'application distincts, car vous pourrez alors décharger celui dont vous n'avez plus besoin par la suite. Vous pouvez ensuite exécuter votre logique dans le domaine d'application correct, comme décrit dans Comment créer un domaine d'application et y exécuter mon application? .

0
L-Four

Il existe une entrée de blog avec une solution ici , reportez-vous également à ce SO thread Chargement de différentes versions du même assemblage

0
BrokenGlass