ILDASM e ILASM: un esempio pratico (e c'entra anche NHibernate)
Accadde un giorno che avevo un piccolo (e vecchio) CMS con un bug da fixare e ho avuto l'idea di aggiornare il motore di persistenza, che usava NH 1.2.0 alla nuovissima 2.0.1. Scarico quindi i due progetti NHibernate.Core e NHibernate.Caches ma... niente! Quest'ultima non ne voleva sapere di andare a causa di una reference verso la versione 2.0.0 di NHibernate che purtroppo non era più disponibile per il download.
Premetto che ad oggi il problema è stato risolto, ora NHibernate.Caches punta alla versione corretta, ma in quel frangente mi sono trovato abbastanza spaesato. Le possibili soluzioni erano:
- Ricompilare tutto NHibernate, modificando il numero di versione a 2.0.0, ma non mi piaceva l'idea
- Scaricare i sorgenti della Cache e modificare la reference, ma questi non erano disponibili se non come trunk SVN, e avrei in questo modo rischiato di portare in produzione codice non ancora ufficialmente rilasciato
- Utilizzare l'Assembly Binding Redirection del CLR
- Disassemblare l'assembly NHibernate.Caches e modificare la reference per farlo puntare a NH 2.0.1
A dispetto delle apparenze, la soluzione 4 è in assoluto la più veloce e semplice e infatti è proprio quella che ho scelto.
I passi sono estremamente banali:
- Si apre l'assembly con ILDASM
- Si seleziona File -> Dump, avendo cura di impostare a checked tutte le checkbox proposte
- A questo punto basta aprire il file .IL generato con un qualsiasi editor testuale e cercare ".assembly extern" per posizionarsi nella sezione del MSIL che contiene l'indicazione delle reference
- Modificare manualmente la reference alla versione voluta e salvare
- Ricompilare il file IL con l'istruzione a riga di comando:
ILASM nomeFileMSIL.IL /DLL /OUTPUT=nomeAssembly.dll
Et voilà, it works!











