Logo UGIdotNET

Ricreare Gacutil da codice

Le soluzioni "ufficiali" per installare un assembly nella Global Assembly Cache sono due:

  • creare un setup MSI che se ne occupa (ed è la soluzione da usare in produzione)
  • utilizzare Gacutil.exe -i per installare gli assembly che interessano (consigliata solo sulle macchine di sviluppo)

E' anche possibile trascinare gli assembly direttamente nella cartella %windir%/assembly da Explorer, e questi verranno automaticamente registrati.

Nota: tutte queste soluzioni presuppongono che l'utente sia amministratore, la soluzione MSI può anche essere utilizzata via Group Policy se impostato dall'amministratore di dominio, senza che l'utente abbia i diritti necessari.

A volte non è possibile utilizzare un setup, Gacutil non è sempre disponibile (ufficialmente fa parte dell'SDK e non del redistributable, anche se alcune versioni del Framework lo installavano lo stesso) e potrebbe non essere conveniente trascinare a mano i file, soprattutto se si vuole automatizzare una serie di operazioni.

La soluzione risiede nelle Fusion API, una serie di API COM che permettono di manipolare la GAC.

La documentazione di queste API per la versione 1.x è disponibile sulla KB317540.

Queste API sono API COM sono utilizzabili sia da codice C++, sia da codice VB.NET e C#, ma sono abbastanza ostiche e bisogna gestirle a mano.

A partire dalla versione 2.0 nell'SDK è presente un file fusion.h che semplifica l'utilizzo delle API, e queste sono anche documentate su MSDN (anche se la documentazione è sparsa nelle Global Static Functions - Unmanaged API Reference).

Per maggiori informazioni sulle API sia per la versione 1.x, sia per la 2.0 è possibile guardare questo articolo.

Nell'SDK del framework è presente un file chiamato FusionInstall.cs (nella cartella Samples\Technologies\Interop\Advanced\Comreg) che permette di usare le API COM direttamente da un programma C#. Attraverso questo file diventa banale realizzare il proprio sostituto di Gacutil, in quanto in quest'esempio vengono preparati direttamente due metodi statici che permettono di registrare e deregistrare un assembly. Maggiori informazioni possono essere trovate in questo thread.

Autore: Lorenzo Barbieri
Data: 31 agosto 2006
Ultimo aggiornamento: 31 agosto 2006
Categorie: 

© 2001 User Group Italiano UGIdotNET. Tutti i diritti riservati. Note legali. - Partita IVA 01927050185