2009-02-22 13 views
118

Che cos'è un AppDomain? Quali sono i vantaggi di AppDomains o del perché Microsoft ha introdotto il concetto di AppDomains, quale era il problema senza AppDomains?Che cos'è AppDomain?

Prego elaborare.

+4

http://stackoverflow.com/questions/665668/usage-of-appdomain-in-c Interessante è la risposta degli stessi ragazzi! –

+0

Una nota aggiuntiva, la classe ApplicationManager si trova in cima a TUTTI gli AppDomain in esecuzione. – contactmatt

+0

http://stackoverflow.com/a/41410172/993672 ha risposto qui –

risposta

104

Un AppDomain fornisce uno strato di isolamento all'interno di un processo. Tutto ciò che di solito si pensa come "per programma" (variabili statiche, ecc.) È in realtà per-AppDomain. Questo è utile per:

  • plugin (è possibile scaricare un AppDomain, ma non un'assemblea all'interno un AppDomain)
  • di sicurezza (è possibile eseguire una serie di codice con livelli di attendibilità specifici)
  • isolamento (è possibile eseguire diverse versioni di assemblee ecc)

Il dolore è è necessario utilizzare i servizi remoti ecc

See MSDN per molte altre informazioni. Ad essere onesti, non è qualcosa con cui devi fare casino molto spesso.

+11

Una piccola (ma importante) cosa da dire: AppDomains non copre i thread. – mmmmmmmm

+0

@ RüdigerStevens cosa intendi ?? – AgentFire

+5

@AgentFire: se un codice in esecuzione in alcuni thread e alcuni AppDomain chiama il codice da un altro AppDomain, il thread "incrocia" il bordo di AppDomain ed esegue il codice da quell'altro AppDomain. Quindi i thread non appartengono ad AppDomain specifici ... sebbene si possa dire che un thread "appartiene" al dominio da cui proveniva il codice che lo ha creato. Ma un thread può eseguire codice da qualsiasi AppDomain. – mmmmmmmm

31

AppDomains può essere visualizzato come processi leggeri. Condividono molte delle stesse caratteristiche di un processo, ad es. hanno le loro copie di statica, assemblaggi e così via, ma sono contenuti in un unico processo. Dal punto di vista del sistema operativo, un processo è solo un processo, indipendentemente dal numero di AppDomain che può contenere.

A differenza di un processo, tuttavia, un AppDomain non ha thread a meno che non vengano creati in modo esplicito. Un thread può eseguire codice in qualsiasi AppDomain.

AppDomains fa parte dello stesso processo e quindi condivide lo stesso heap gestito. Questo di solito non è un problema poiché il modello di programmazione AppDomain impedisce l'accesso implicito tra AppDomains. Tuttavia, alcuni riferimenti sono effettivamente condivisi tra AppDomains come gli oggetti di testo e le stringhe internate.

+0

Solo una nota. Le stringhe internate non sembrano essere condivise tra diversi AppDomains –

41

Un dominio App implementa il concetto di uno spazio di memoria virtuale contiguo che contiene il codice e le risorse in memoria che possono essere direttamente accessibili o referenziati.

AppDomain separati non condividono lo spazio di memoria e, di conseguenza, un AppDomain non può fare direttamente riferimento al contenuto in un altro. In particolare, i dati devono essere trasferiti tra AppDomains attraverso un processo copy-by-value. In particolare, gli oggetti di riferimento, che si basano su puntatori e quindi su indirizzi di memoria, devono prima essere serializzati dalla sorgente e quindi deserializzati nell'AppDomain di destinazione.

Precedentemente su sistemi Windows, i limiti di memoria sono stati implementati dai processi; tuttavia, la costruzione di processi richiede un uso intensivo delle risorse. Hanno anche un duplice scopo come limiti del filo. I domini delle app, d'altra parte, riguardano solo il limite della memoria o lo spazio degli indirizzi. I thread possono "scorrere" attraverso AppDomain (ovvero, una procedura può richiamare un punto di ingresso in un altro AppDomain e attendere che venga restituito. Si dice che il thread "continua" l'esecuzione nell'altro AppDomain).

Un vantaggio significativo di questa architettura è che i modelli di comunicazione tra App-domini rimangono sostanzialmente invariati se i AppDomain sono nello stesso processo, processi diversi, o su un diverse macchine tutti insieme: cioè il processo di serializzazione e deserializzazione (marshalling) dei dati dei parametri.

Nota 1: il significato di un filo che attraversa un AppDomain è quella di un blocco o chiamata di metodo sincrono in un altro AppDomain (invece di una non bloccante o chiamata asincrona che riproducono un altro filo per continuare l'esecuzione nel dominio di applicazione di destinazione e continuare nel suo AppDomain corrente senza attendere la risposta).

Nota 2: esiste una funzionalità di archiviazione locale dei thread. Tuttavia, un nome migliore sarebbe stato App-Domain Thread Local Storage poiché i thread lasciano i loro dati indietro mentre attraversano App-Domains ma li rilevano quando ritornano: http://msdn.microsoft.com/en-us/library/6sby1byh.aspx

Nota3: A .Net Runtime è un processo di Windows applicazione con un heap associato. Può ospitare uno o più AppDomain in quell'heap. Tuttavia, gli AppDomain sono progettati per essere ignari l'uno dell'altro e per comunicare tra loro tramite il marshalling. È ipotizzabile che sia possibile eseguire un'ottimizzazione che ignora il marshalling tra gli AppDomain comunicanti che condividono lo stesso Runtime .Net e quindi lo stesso heap del processo di Windows.

+0

Beh, ero un po 'confuso tra la tua affermazione ** AppDomain separati non condividono lo spazio di memoria ** e @Brian Rasmussen ** AppDomains fanno parte dello stesso processo e quindi condividono effettivamente lo stesso heap gestito **. Puoi chiarire un po '? –

+0

Quando AppDomains fa parte dello stesso stesso processo di Windows (e quindi all'interno della stessa istanza di .Net runtime), si troveranno necessariamente nello stesso heap gestito di detto processo di Windows; tuttavia, questa circostanza sarà normalmente invisibile all'applicazione .Net. Ricorda, l'applicazione .Net non è un'applicazione di processo di Windows e in realtà viene eseguita in una sorta di macchina virtuale. – George

Problemi correlati