Assembly Binding Redirection
Introduzione
Lo scenario che andremo a studiare in questo tip/articolo è tra i più comuni: abbiamo rilasciato un'applicazione, per esempio un'applicazione web, la quale fa uso di una dll di terze parti, magari un controllo open-source.
La nostra applicazione funziona bene, fino a che non scopriamo un grosso baco all'interno dell'assembly di terze parti. Il nostro fornitore rilascia una nuova versione dell'assembly, con il baco corretto, e non modifica le interfacce ed i metodi del componente.
La nostra applicazione, però, è compilata con una determinata versione del componente, per cui se proviamo a copiare la dll con la nuova versione nella directory bin, otteniamo un bell'errore... che fare, dunque?
La soluzione
Di primo acchito ci viene da pensare: "...ricompilo la mia applicazione cambiando riferimento e facendolo puntare al nuovo assembly, poi distribuisco il nuovo assembly della mia applicazione e..."; la cosa si può fare, ma spesso, per risolvere delle situazioni spinose in breve tempo senza ricompilare, o magari quando ricompilare NON è proprio possibile, si può utilizzare la tecnica dell' Assembly Redirection. Questa tecnica consente di reindirizzare l'assembly probing a run-time, scambiando di fatto le versioni di un assembly e facendo in modo che un'applicazione già compilata con una determinata versione di un assembly, punti ad una nuova versione. La cosa sta in piedi, ovviamente, se la firma dei metodi delle classi dell'assembly di terze parti invocati dalla nostra applicazione non sono cambiati...pena il crash dell'applicazione non appena qualcuno di questi metodi verrà invocato a run-time. Di seguito vediamo la sintassi per ottenere la sostituzione a run-time dell'assembly ThirdParty.Controls dalla versione 1.0.0.0 (con la quale è stata compilata la nostra applicazione), alla versione 2.0.0.0, quella priva di bachi, per intenderci.
<configuration>
<!--...-->
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="ThirdParty.Controls"
publicKeyToken="32ab4ba45e0a69a1"
culture="neutral" />
<bindingRedirect oldVersion="1.0.0.0"
newVersion="2.0.0.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
<!--...-->
</configuration>
Se stiamo lavorando con un'applicazione Web, questo comporta una modifica del file Web.Config ed una copiatura della nuova DLL nella directory bin. Per maggiorni informazioni ed approfondimenti, visitate questo link.
indietro