2010-02-03 18 views
41

¿Es posible realizar una redirección de enlace de ensamblaje entre las diferentes versiones de un ensamblado al que se hace referencia si el token de clave pública es nulo en la versión anterior y se establece en la versión más reciente?.Net Assembly Binding Redirect con diferentes claves públicas Tokens

Por ejemplo, tengo dos montajes ...

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

caso de que el siguiente trabajo de redirección de enlace de ensamblado en el web.config 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> 

Respuesta

33

No, no es posible. Los ensambles necesitan tener el mismo publicKeyToken.

La etiqueta bindingRedirect solo tiene los atributos oldVersion y newVersion, por lo que no hay forma de contarle la versión "nula" de todos modos.

5

Es posible que pueda utilizar el evento AppDomain.AssemblyResolve para hacerlo. He incluido un código de muestra en this answer.

+2

Lamentablemente, parece que los tokens de clave pública todavía deben coincidir. Cuando intento cargar manualmente un ensamblaje diferente (con 'bindingRedirect' o sin), obtengo" La definición del manifiesto del ensamblaje ubicado no coincide con la referencia del ensamblado ". – ladenedge

+0

@ladenedge, si observa el código de muestra en la respuesta a la que me he vinculado, le permite usar cualquier criterio que desee para decidir qué ensamblaje usar. En la muestra, utilicé el nombre del ensamblado e ignoré los tokens de clave pública. Tenga en cuenta que mi muestra cargaba dinámicamente un ensamblaje desde un archivo, no en el momento del inicio. Para ser justos, no he tratado de hacer lo que estás hablando, por lo que puede ser imposible. –

1

Parece que un re-direccionamiento de unión no puede ser utilizado, pero en mi caso lo logró sortear el problema con diferentes publicKeyTokens mediante la modificación de la señal de valor que se solicita en la DLL de referencia:

Desarme el dll a IL, cambie la referencia, reensamble (y vuelva a firmar, lo que podría ser un problema si no tiene el archivo de claves).

(ver mi comentario sobre when referencing assemblies, is it possible to insist on a version number but ignore the publickeytoken? (ie accept signed/unsigned))

Cuestiones relacionadas