Ecco lo scenario: il vostro collega ha sviluppato 
in C# un assembly molto carino. L'assembly si chiama 
GetBirthday.dll e dispone di un solo metodo statico, 
GetNearestBirthday(). L'assembly è strong-named. Il nostro 
collega l'ha installato nella nostra GAC con un piccolo installer 
fatto da lui. Il metodo GetNearestBirthday ritorna una string contenente il 
compleanno più vicino nel tempo fra quelli presenti in un database SQL Server 
(qualsiasi riferimento all'applicazione Age è puramente 
casuale).
L'assembly installato in questo momento è alla versione 1.0.0.0: noi lo 
abbiamo usato nella nostra applicazione Age, e gira a 
meraviglia. Clicco un pulsante, e in una TextBox mi viene detto che il prossimo 
compleanno è di mio papà!!! Me lo devo ricodare...
Oggi il nostro collega ha preparato una nuova versione di 
GetBirthday.dll (la 1.1.0.0) con un nuovo metodo (che adesso è 
OT e non ci interessa). Ci prepara un nuovo installer, che noi prontamente 
eseguiamo. Lanciamo la nostra applicazione, ed otteniamo una bella exception 
all'avvio. Aiuto, e ADESSO? Abbiamo due strade:
  - Chiamiamo il nostro collega, gli facciamo vedere il problema, lo copriamo 
  di insulti e nel frattempo noi siamo bloccati con il nostro 
  lavoro perchè l'assembly blocca tutto
  
- Chiamiamo il nostro collega, gli facciamo vedere il problema, lo copriamo 
  di insulti e nel frattempo continuiamo tranquillamente a 
  lavorare usando la versione precedente dell'assembly
Siccome siamo persone civili, propendiamo per la seconda opzione. Come 
facciamo? Il giochino sta nel lavorare sui files XML che .NET utilizza per 
gestire tutto l'ambiente di runtime del CLR. Facendola breve, apriamo il file 
Age.exe.config ed aggiungiamo il seguente blocco XML:
<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
            <assemblyIdentity    name="GetBirthday"
                                publicKeyToken="bfe1065dc666ab20"/>
            <bindingRedirect    oldVersion="1.1.0.0"
                                newVersion="1.0.0.0"/>
        </dependentAssembly>
    </assemblyBinding>
</runtime>
I tag <runtime></runtime> contengono tutte le informazioni che il 
runtime .NET userà per reindirizzare una versione di un assembly ad un altra. 
Nel nostro caso, specifichiamo che se la nostra applicazione vuole 
usare la versione 1.1.0.0 di GetBirthday (che è quella che ci dà errore), 
in realtà dovrà usare la 1.0.0.0 (che invece è quella che gira correttamente). 
Et voilà, il gioco è fatto!!!
Altre informazioni
Da notare che questo "giochino" di 
redirect è possibile solo se l'assembly è strong-named, perchè solo questi 
assembly hanno una release. Il CLR ignora di fatto la versione di un assembly 
che non è strong-named.
Il blocco XML indicato sopra può essere utilizzato anche nei files 
machine.config e web.config. Io personalmente ho avuto comunque 
qualche problema. Incollandolo nel mio machine.config, non mi partiva più IMHO (con un TypeInizializationException): perchè? In teoria IMHO 
non è nemmeno a conoscenza del mio assembly, perchè mi segnala 
questa exception?
powered by IMHO 1.2