62 votes

Redirection de liaison d'assemblage .Net avec des jetons de clé publique différents

Est-il possible d'effectuer une redirection de liaison d'assemblage entre différentes versions d'un assemblage référencé si le jeton de clé publique est nul sur l'ancienne version et défini sur la nouvelle version ?

Par exemple, j'ai deux assemblages...

System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null

y

System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35

La redirection de liaison d'assemblage suivante devrait-elle fonctionner dans le web.config d'Asp.Net...

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35"/>
      <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0"/>
    </dependentAssembly>
  </assemblyBinding>
</runtime>

48voto

Mark Worth Points 446

Non, ce n'est pas possible. Les assemblages doivent avoir le même publicKeyToken.

La balise bindingRedirect ne dispose que des attributs oldVersion et newVersion, il n'y a donc aucun moyen de lui indiquer la version "null" de toute façon.

Mais la véritable raison est expliquée en raison de la mécanisme de nom fort

6voto

Don Kirkby Points 12671

Vous pourrez peut-être utiliser le AppDomain.AssemblyResolve pour ce faire. J'ai inclus un exemple de code dans cette réponse .

6 votes

Malheureusement, il semble que les jetons de clé publique doivent toujours correspondre. Lorsque j'essaie de charger manuellement un assemblage différent (avec bindingRedirect ou sans), j'obtiens "La définition du manifeste de l'assemblage localisé ne correspond pas à la référence de l'assemblage".

0 votes

@ladenedge, si vous regardez l'exemple de code dans la réponse dont j'ai donné le lien, vous pouvez utiliser tous les critères que vous voulez pour décider de l'assemblage à utiliser. Dans l'exemple, j'ai utilisé le nom de l'assemblage et ignoré les jetons de clé publique. Notez que mon exemple chargeait dynamiquement un assemblage à partir d'un fichier, et non au moment du lancement. Pour être honnête, je n'ai pas essayé de faire ce dont vous parlez, donc c'est peut-être impossible.

1voto

mwardm Points 700

Il semble qu'une redirection de liaison ne puisse pas être utilisée, mais dans mon cas, j'ai réussi à contourner le problème des PublicKeyTokens différents en modifiant la valeur du jeton demandé dans la DLL de référence :

Désassemblez la dll en IL, changez la référence, réassemblez (et re-signez - ce qui peut être un problème si vous n'avez pas le fichier clé).

(Voir mon commentaire sur lors de la référence à des assemblages, est-il possible d'insister sur un numéro de version mais d'ignorer le publickeytoken ? (c'est-à-dire accepter signé/non signé) )

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