Domanda

Mi chiedevo cosa succede se ero a caricare lo stesso complesso di byte due volte in un'applicazione web.

Per esempio io ho questo codice

byte[] assem = System.IO.File.ReadAllBytes(appRoot + "/Plugins/Plugin.dll");

var loadedAssem = Assembly.Load(assem);

var plugin = loadedAssem.CreateInstance("Plugin.ThePlugin") as IPlugin;

ho incontrato questo codice e alla prima richiesta presumo che sarebbe caricare l'assembly nella RAM (o http runtime dominio di applicazione?) E poi posso creare istanze di tutto ciò che è in là.

Se ho eseguito di nuovo il codice, dire sulla seconda richiesta di ciò che sarebbe accaduto al gruppo alla prima richiesta?

Sarebbe ancora esiste in ram? in caso affermativo come fa distinzione tra i due gruppi? o lo fa sovrascrivere la precedenza dichiarano le classi?

Questo è per la mia comprensione, come come faccio io in PHP non è solo un caso di "require_once".

È stato utile?

Soluzione

Questo caricherà due copie distinte del complesso, ognuno dei quali può essere utilizzato dall'applicazione. I tipi in ciascun gruppo sono tipi distinti e non inter-operare con un altro. Per esempio, se si prende un widget dal Copia1 e tenta di passare ad un metodo che accetta un widget su Copy2, questo causerà un errore runtime. Non è possibile assiemi scaricamento volta che sono stati caricati in questo modo (cioè nel tuo AppDomain principale.)


Per quanto riguarda la creazione di un'istanza:

  • Se si utilizza Assembly.CreateInstance (come mostrato nel tuo post), questo creerà esso dall'istanza Assemblea si è utilizzato per effettuare la chiamata.
  • Se si utilizza un Activator.CreateInstance che prende una stringa, è necessario specificare il nome di assembly. Dal momento che entrambi i gruppi caricati avranno lo stesso nome, in questo caso, si utilizzerà di assemblaggio regole di risoluzione, che, a mio avviso per impostazione predefinita, favorirà la prima partita (in modo che il montaggio è stato caricato prima.) Non sono sicuro di questo. È possibile agganciare il AppDomain.AssemblyResolve evento per fornire la vostra propria priorità e rendere utilizzare il più di recente-caricato assemblaggio.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top