Caricamento di DLL in un AppDomain separato

Voglio caricare una o più DLL dynamicmente in modo che vengano eseguite con una sicurezza diversa o base diversa dalla mia applicazione principale. Come carico queste DLL in un AppDomain separato e istanzio gli oggetti da loro?

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 generate) ora hai un’istanza di TypeIWantToLoad caricata nel tuo nuovo dominio. L’istanza che hai è in realtà un proxy (poiché l’object reale si trova nel nuovo dominio) ma puoi usarlo proprio come il tuo object normale.

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

Se il tuo targeting è 3.5, puoi sfruttare il nuovo framework di estensibilità gestita per gestire tutto il lavoro pesante per te.

È ansible utilizzare il metodo AppDomain.CreateInstance per eseguire ciò. Dovrai chiamare il metodo Unwrap dell’object ObjectHandle che viene restituito per ottenere l’object reale.

Crea un nuovo Appdomain con AppDomain.Create (…). Dopo aver creato l’AppDomain, caricare le DLL in AppDomain.

Guarda tutti i metodi che Appdomain ha con Crea *. Ci sono alcune cose come CreateInstanceAndUnwrap, ecc.

Come precedentemente affermato, usa AppDomain.CreateDomain per creare un nuovo dominio per app. È quindi ansible caricare un assembly in esso utilizzando il metodo Load o persino eseguire un assembly utilizzando il metodo ExecuteAssembly. È ansible utilizzare GetAssemblies per verificare se un assembly è già stato caricato. Si noti inoltre che non è ansible scaricare un assieme una volta caricato. Dovrai scaricare il dominio.