Newsgroup: it.comp.www.asp
Titolo: [IIS] unload di una DLL

ciao,
conoscete qualche utility magari del resource kit per fare l'unload di
una dll non in uso ma caricata in memoria perche' usata
precedentemente?
mi servirebbe perche' senno' tutte le volte che compilo il mio codice
e devo aggiornare il file dll devo stoppare tutto l'inetinfo (non
basta il singolo virtual server) e per me e' inaccettabile, sia per il
tempo che ci vuole sia per il fatto che se dovessi farlo sulla
macchina di produzione dovrei stoppare tutti i domini dei clienti...
thanks :)
[~ federico 'pix' feroldi ~ 
p...@numerica.it
 ~]
[~ 
http://www.logicom.it/pix
 - ICQ #6541674 ~]

...


regsvr32.exe ........  /u
cosi' me la disinstalla proprio, io voglio solo che ne faccia l'unload
dalla memoria... che controindicazioni ci sono a
disintallare/reinstallare la dll?


disintallare/reinstallare la dll?
Con regserver /u si unregistra un componente COM che ha la sventura
di essere contenuto in una DLL, non si disinstalla nulla.
Per quanto rigurda l'unload dei componenti COM, la storia e' complessa.
Se c'e' il Transaction Server di mezzo, allora questo e' pensato
per cercare di non scaricare le connessioni, ma di riusarle.
Se invece il Componente COM e' istanziato a livello di pagina, settandolo
a nothing comporta che, la libreria COM, quando decide di chiamare
CoFreeUnusedLibraries, scarichi la DLL dalla memoria. Ovviamente non
ci devono essere altre pagine che stanno mantenendo riferimenti al
componente.

componente.
comunque se la dll viene unregistrata posso sovrascriverla anche se e'
ancora caricata in memoria? oppure fare l'upgrade della versione in
memoria se la dll e' compatibile?


dalla memoria?
La unregistrazione, per definizione di COM, comporta la cancellazione
di chiavi dal Registry (se vuoi specifico quali).
L'unload di una DLL dovrebbe essere preceduto dalla consultazione
della funzione esportata dalla DLL "DllCanUnloadNow".
Se tu hai un processo A (MTX.exe nel caso di componenti ASP) che ha
caricato ASP.DLL (a sua volta un componente COM e filtro ISAPI)
che ha caricato pippo.DLL (regilarmente registrata),
ha invocato "DllGetClassFactory",
ha istanziato e cancellato tutti i riferimenti ad oggetti di pippo.DLL,
non e' detto che la libreria COM provochi l'unload dalla memoria di
pippo.DLL. Tipicamente lo puo' fare anche dopo 10 minuti,
per un motivo di distruttori
di oggetti che sarebbe lungo spiegare. Ora dopo 10 minuti COM verifica se
c'e' qualche libreria che puo essere scaricata, e per fare questo
invoca la funzione "DllCanUnloadNow", che se da' l'OK consente l'unload
della DLL.
Nel casi di componenti COM scritti con VB, la faccenda e' la stessa,
solo che non e' possibile controllare la vita residua delle DLL in modo
diretto.
Quando una DLL viene mappata nello spazio di indirizzamento del processo,
le sezioni vengono messe (ma dovrei controllare) nel file di swap,
per cui dovrebbe essere possibile andare a modificare il file stesso,
senza che per questo venga modificata la parte mappata in memoria nel
processo corrente.
Forse sarebbe il caso di creare un componente VB che come unica cosa utile
faccia una chiamata a "CoFreeUnusedLibraries", tanto per essere sicuri di
cosa
si sta scaricando.