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