Technology Experience

Contenuti gestiti da Igor Damiani
posts - 949, comments - 2741, trackbacks - 15120

My Links

News

  • Questo blog si propone di raccogliere riflessioni, teoriche e pratiche, su tutto quello che riguarda il world-computing che mi sta attorno: programmazione in .NET, software attuale e futuro, notizie provenienti dal web, tecnologia in generale, open-source.

    L'idea è quella di lasciare una sorta di patrimonio personale, una raccolta di idee che un giorno potrebbe farmi sorridere, al pensiero di dov'ero e cosa stavo facendo.

    10/05/2005,
    Milano

Archives

Post Categories

Generale

[MCAD.45] Reindirizzare un assembly da una oldVersion ad una newVersion

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:

  1. 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
  2. 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

Print | posted on martedì 4 ottobre 2005 16:01 | Filed Under [ MCAD ]

Feedback

Gravatar

# re: [MCAD.45] Reindirizzare un assembly da una oldVersion ad una newVersion

Aggiungo una nota:
Con la seguente configurazione è possibile indicare che tutti le versioni MyAssembly (dalla 0.0.0.0 alla 65535.65535.65535.65535) vadano a puntare all'ultima versione indicata su 'newversion' che si trova su href='percorso'

<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="MyAssembly" publicKeyToken="thisismykeytoken" />
<bindingRedirect oldVersion="0.0.0.0-65535.65535.65535.65535" newVersion="1.1.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="ArubaCore" publicKeyToken="thisismykeytoken" />
<codeBase version="1.1.0.0" href="file:///c:\MyAssemblies\MyAssembly" />
</dependentAssembly>
</assemblyBinding>
</runtime>
04/10/2005 17:12 | Luciano Castro
Gravatar

# re: [MCAD.45] Reindirizzare un assembly da una oldVersion ad una newVersion

per favore
04/10/2005 19:26 | ivan ghendov
Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET