Domini applicazione e assembly
In questa sezione viene illustrata la relazione tra domini applicazione e assembly. Per eseguire il codice contenuto in un assembly, è necessario innanzitutto caricare l'assembly in un dominio applicazione. L'esecuzione di un'applicazione tipica implica il caricamento di diversi assembly in un dominio applicazione.
Il modo in cui viene caricato un assembly determina se il codice con compilazione JIT può essere condiviso da più domini applicazione nel processo e se l'assembly può essere scaricato dal processo.
Se un assembly viene caricato come indipendente dal dominio, tutti i domini applicazione che condividono lo stesso insieme di autorizzazioni di sicurezza possono condividere lo stesso codice con compilazione JIT, il che comporta una riduzione della quantità di memoria richiesta dall'applicazione. L'assembly tuttavia non può mai essere scaricato dal processo.
Se non viene caricato come indipendente dal dominio, un assembly deve essere sottoposto a compilazione JIT in ogni dominio applicazione in cui viene caricato. È tuttavia possibile scaricare l'assembly dal processo scaricando tutti i domini applicazione nei quali è caricato.
L'host di runtime determina se caricare gli assembly come indipendenti dal dominio nel momento in cui carica il runtime in un processo. Per le applicazioni gestite, applicare l'attributo LoaderOptimizationAttribute al metodo del punto di ingresso del processo e specificare un valore dall'enumerazione LoaderOptimization associata. Per applicazioni non gestite che ospitano Common Language Runtime, specificare il flag appropriato quando si chiama il metodo CorBindToRuntimeEx Function.
Il caricamento di assembly indipendenti dal dominio può avvenire in tre modi:
Con l'impostazione SingleDomain non viene caricato alcun assembly come indipendente dal dominio, ad eccezione di Mscorlib, che viene sempre caricato come indipendente dal dominio. Questa impostazione viene denominata a dominio singolo perché viene utilizzata in genere quando sull'host è in esecuzione una sola applicazione nel processo.
Con l'impostazione MultiDomain tutti gli assembly vengono caricati come indipendenti dal dominio. Utilizzare questa impostazione quando nel processo esistono più domini applicazione che eseguono tutti lo stesso codice.
Con l'impostazione MultiDomainHost vengono caricati come indipendenti dal dominio gli assembly con nome sicuro, purché siano stati installati insieme alle relative dipendenze nella Global Assembly Cache. Gli altri assembly vengono caricati e sottoposti a compilazione JIT separatamente per ogni dominio applicazione in cui sono stati caricati e possono pertanto essere scaricati dal processo. Utilizzare questa impostazione se si eseguono più applicazioni nello stesso processo o se si dispone di una combinazione di assembly condivisi da molti domini applicazione e di assembly che devono essere scaricati dal processo.
Il codice con compilazione JIT non può essere condiviso per gli assembly caricati nel contesto di origine del caricamento utilizzando il metodo LoadFrom della classe Assembly né può essere caricato da immagini utilizzando overload del metodo Load che specificano matrici di byte.
Gli assembly compilati nel codice nativo utilizzando il Ngen.exe (generatore di immagini native) possono essere condivisi tra domini applicazione se sono stati caricati come indipendenti dal dominio la prima volta che sono stati caricati in un processo.
Il codice con compilazione JIT per l'assembly contenente il punto di ingresso dell'applicazione è condiviso solo se possono essere condivise tutte le dipendenze.
Un assembly indipendente dal dominio può essere sottoposto a compilazione JIT più di una volta. Se ad esempio gli insiemi di autorizzazioni di sicurezza di due domini applicazione sono diversi, non possono condividere lo stesso codice con compilazione JIT. Ciascuna copia dell'assembly con compilazione JIT tuttavia può essere condivisa con altri domini applicazione con lo stesso insieme di autorizzazioni.
Quando si decide se caricare o meno gli assembly come indipendenti dal dominio, è necessario trovare un compromesso tra la riduzione dell'utilizzo di memoria e altri fattori relativi alle prestazioni.
L'accesso a dati e metodi statici è più lento per gli assembly indipendenti dal dominio a causa della necessità di isolare gli assembly. Ciascun dominio applicazione che accede all'assembly deve disporre di una copia separata dei dati statici, per evitare che i riferimenti agli oggetti contenuti nei campi statici superino i limiti del dominio. Il runtime contiene la logica aggiuntiva necessaria per indirizzare un chiamante alla copia appropriata del metodo o dei dati statici. Tale logica aggiuntiva rallenta la chiamata.
Tutte le dipendenze di un assembly devono essere individuate e caricate quando l'assembly viene caricato come indipendente dal dominio, poiché una dipendenza che non può essere caricata come indipendente dal dominio impedisce il caricamento dell'assembly come indipendente dal dominio.