Domanda

Desidero caricare dinamicamente una o più DLL in modo che vengano eseguite con una sicurezza o un percorso base diverso rispetto alla mia applicazione principale.Come posso caricare queste DLL in un AppDomain separato e creare un'istanza di oggetti da esse?

È stato utile?

Soluzione

Più specificamente

AppDomain domain = AppDomain.CreateDomain("New domain name");
//Do other things to the domain like set the security policy

string pathToDll = @"C:\myDll.dll"; //Full path to dll you want to load
Type t = typeof(TypeIWantToLoad);
TypeIWantToLoad myObject = (TypeIWantToLoad)domain.CreateInstanceFromAndUnwrap(pathToDll, t.FullName);

Se tutto ciò va correttamente (senza eccezioni) ora hai un'istanza di TypeIWantToLoad caricata nel tuo nuovo dominio.L'istanza che hai è in realtà un proxy (poiché l'oggetto reale è nel nuovo dominio) ma puoi usarlo proprio come il tuo oggetto normale.

Nota:Per quanto ne so, TypeIWantToLoad deve ereditare da MarshalByRefObject.

Altri suggerimenti

Se hai come target la versione 3.5, puoi sfruttare la novità framework di estensibilità gestita per gestire tutto il lavoro pesante per te.

Puoi usare il AppDomain.CreateInstance metodo per farlo.Dovrai chiamare il metodo Unwrap dell'ObjectHandle restituito per ottenere l'oggetto reale.

Crea un nuovo dominio App con AppDomain.Create(...).Dopo aver creato l'AppDomain, carica le DLL in quell'AppDomain.

Esamina tutti i metodi di Appdomain con Create*.Ci sono alcune cose come CreateInstanceAndUnwrap, ecc.

Come indicato in precedenza, utilizza AppDomain.CreateDomain per creare un nuovo dominio dell'app.È quindi possibile caricare un assembly al suo interno utilizzando il metodo Load o persino eseguire un assembly utilizzando il metodo ExecuteAssembly.È possibile utilizzare GetAssemblies per verificare se un assembly è già stato caricato.Tieni inoltre presente che non puoi scaricare un assembly una volta caricato.Dovrai scaricare il dominio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top