2010-12-15 6 views
13

Je travaille avec un assemblage tiers et, malheureusement, j'ai maintenant besoin de charger leur dernière version et une version précédente dans mon projet afin que je puisse décider à l'exécution du chargement. J'en ai seulement besoin d'un, pas des deux. Dans cet esprit, je dépends aussi des types fournis par les composants, donc je ne peux pas charger à partir de la réflexion et interroger à chaque fois pour la méthode/événements/interfaces que je veux utiliser. J'ai vu une certaine mention de la manipulation par AppDomain s mais je ne sais pas comment procéder.Chargement de plusieurs versions du même assemblage

Le processus consisterait-il à coder par rapport à une version du composant, puis au moment de l'exécution (à l'aide de l'échange AppDomain) dans la DLL correcte que je souhaite utiliser? Donc, je serais seulement gérer cela au démarrage?

Répondre

0

Si vous avez deux versions différentes d'un même composant, cela signifie que les deux versions peuvent différer non seulement au niveau de l'implémentation mais aussi du nombre d'opérations qu'elles exposent? Si tel est le cas, comment pouvez-vous changer de version si certaines fonctionnalités ne sont que dans l'une des deux versions? Quoi qu'il en soit, si vous voulez charger les deux versions, vous devrez le faire dans deux domaines d'application distincts, car vous pourrez alors décharger celui dont vous n'avez pas besoin par la suite. Ensuite, vous pouvez exécuter votre logique dans le domaine d'application correct, comme décrit dans How do I create an application domain and run my application in it?.

4

Voici les messages couple d'ici sur le SO qui décrivent comment charger plusieurs versions du même ensemble:

Ce message décrit 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 exactement comment il a résolu son problème.

3rd party libraries refer to different versions of log4net.dll

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

Using different versions of the same assembly in the same folder

Dans ce fil, il y a une mise en garde sur le chargement des versions différentes du même ensemble dans le même contexte et les références ce lien sur MSDN:

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

Voici une autre avec une réponse qui suggère d'utiliser AssemblyResolve: Reference two equal assemblies, only public keys differ

7

Si les deux ensembles sont compatibles, vous pouvez définir dans le app.exe Fichier .config ou web.config pour 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 le chargeur de asembly toujours utiliser la version 1.0.3300.0, peu importe ce qui est compilé dans l'appel exe. La même chose est possible avec les nouvelles versions dotnet

Questions connexes