34 votes

Référencement des versions différentes de la même assemblée

Si Une des références de l'assemblée 1.1 B et C, et C références B 1.2, comment évitez-vous de l'assemblée des conflits?

Je nievely supposé C références serait encapsulé à l'écart et n'entraînerait pas de problèmes, mais il semble que toutes les dll sont copiés à la poubelle, qui est où le problème se produit.

Je comprends les deux façons de contourner ce sont d'utiliser le GAC a ou à l'assemblée de liaisons? Le GAC ne semble pas être la meilleure approche pour moi, comme je n'aime pas en supposant que les dll sera là, je préfère de référence dll à partir d'un répertoire lib dans ma solution.

Où que l'assemblée les liaisons ne semble pas solide à moi, que si une version de l'assemblée dispose de fonctionnalités que les autres ne le sont pas, ce n'est pas de produire des problèmes?


Dans mon cas, c'est parce que je suis en utilisant une 3ème partie dll utilise une ancienne version de nHibernate, que j'utilise moi-même.

9voto

Kilhoffer Points 13430

J'ai obtenu le même résultat en utilisant le GAC dans le passé, mais vous devriez vous interroger sur les raisons de votre devoir de référence de plus d'une version et d'essayer de l'éviter si possible. Si vous devez le faire, une liaison de redirection peut être utile dans votre cas.

Aussi, avez-vous lu ce encore?

7voto

Peter Kelly Points 5758

Apparemment peu connue façon de le faire est d'utiliser le mot-clé extern.

De Référence C#

Pour faire référence à deux assemblées, avec les mêmes complet de noms de type, un alias doit être spécifié à l'invite de commande, comme suit:

/r:GridV1=grid.dll

/r:GridV2=grid20.dll

Cela crée l'externe alias GridV1 et GridV2. L'utilisation de ces alias à partir de l'intérieur d'un programme, de référence à l'aide de l' extern mot-clé. Par exemple:

extern alias GridV1;

extern alias GridV2;

Chaque extern alias déclaration introduit une supplémentaire au niveau de la racine espace de noms que de parallels (mais ne se trouve pas à l'intérieur) le global espace de noms. Ainsi, les types de chaque assemblée peut être renvoyé sans l'ambiguïté en utilisant leur nom complet, enracinée dans l' appropriée de l'espace de noms d'alias.

Dans l'exemple précédent, GridV1::Grille serait le contrôle de la grille de de la grille.dll, et GridV2::Grille serait le contrôle de la grille de grid20.dll.

3voto

burton Points 1

J'ai été requises à l'appui de plusieurs versions d'une assemblée et a trouvé cette solution:

  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="MyAssembly" publicKeyToken="..." />
        <codeBase version="1.1.0.0" href="MyAssembly_v1.1.0.0.dll"/>
        <codeBase version="2.0.0.0" href="MyAssembly_v2.0.0.0.dll"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>

1voto

Joe Points 60749

Vous pouvez ajouter un bindingRedirect élément à votre fichier de configuration pour spécifier la version de l'assembly que vous souhaitez utiliser lors de l'exécution.

<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <dependentAssembly>
            <assemblyIdentity name="myAssembly"
                              publicKeyToken="32ab4ba45e0a69a1"
                              culture="neutral" />
            <bindingRedirect oldVersion="1.0.0.0"
                             newVersion="2.0.0.0"/>
         </dependentAssembly>
      </assemblyBinding>
   </runtime>
</configuration>

1voto

AlanR Points 487

L' .NET est parfaitement capable de charger plusieurs versions de la même assemblée simultanément. Si vous allez ouvrir cette boîte de pandore, cependant, je vous suggère fortement fortement nom de votre assemblées et utiliser les Principaux.Mineure.* schéma d'affectation de noms pour éviter les conflits de noms.

Je ne pense pas que vous devriez penser à un one-size-fits-all approche de l'aide (ou pas) le GAC. Le GAC peut être vraiment sympa si vous voulez automatiquement utiliser la nouvelle fonctionnalité publié avec les futures versions de DLL. Bien sûr, cette bénédiction a un coût que les nouvelles versions peuvent ne pas fonctionner exactement comme vous vous attendez à eux aussi :). C'est tout une question de ce qui est le plus pratique, et combien vous avez de contrôle sur ce qui est publié dans le GAC.

En ce qui concerne, -Alan.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X