Magazine

Assembly Binding Redirection

Davide Senatore

22/01/2007

Reindirizzare nuove versioni di assembly in applicazioni già distribuite

0%100%
per esprimere un voto è necessario registrarsi al sito

Concetti di base di .net, assembly probing

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.

Commenti
Nome

Sito web
Commento


indietro