Pertanyaan Memuat DLL ke AppDomain terpisah


Saya ingin memuat satu atau lebih DLL secara dinamis sehingga mereka berjalan dengan keamanan atau basepath yang berbeda dari aplikasi utama saya. Bagaimana cara memuat DLL ini ke AppDomain terpisah dan instantiate objek dari mereka?


32
2017-09-17 23:36


asal


Jawaban:


Lebih spesifik

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);

Jika semua itu berjalan dengan baik (tidak ada pengecualian dilemparkan), Anda sekarang memiliki turunan dari TypeIWantToLoad yang dimuat ke dalam domain baru Anda. Instance yang Anda miliki sebenarnya adalah proxy (karena objek sebenarnya ada di domain baru) tetapi Anda dapat menggunakannya seperti objek normal Anda.

Catatan: Sejauh yang saya tahu, TypeIWantToLoad harus mewarisi dari MarshalByRefObject.


34
2017-09-18 14:29



Jika Anda menargetkan 3,5, Anda dapat memanfaatkan yang baru dikelola kerangka diperpanjang  untuk menangani semua beban berat untukmu.


4
2017-09-17 23:50



Anda dapat menggunakan AppDomain.CreateInstance metode untuk melakukan ini. Anda harus memanggil metode Unwrap dari ObjectHandle yang dikembalikan untuk mendapatkan objek yang sebenarnya.


2
2017-09-17 23:46



Buat Appdomain baru dengan AppDomain.Create (...). Setelah membuat AppDomain memuat DLL ke AppDomain itu.

Lihat semua metode yang dimiliki Appdomain dengan Create *. Ada hal-hal tertentu seperti CreateInstanceAndUnwrap, dll.


0
2017-09-17 23:50



Seperti yang dinyatakan sebelumnya, gunakan AppDomain.CreateDomain untuk membuat domain aplikasi baru. Anda kemudian dapat memuat perakitan ke dalamnya menggunakan metode Load, atau bahkan mengeksekusi perakitan menggunakan metode ExecuteAssembly. Anda dapat menggunakan GetAssemblies untuk melihat apakah suatu assembly telah dimuat. Sadarilah juga bahwa Anda tidak dapat membongkar perakitan setelah dimuat. Anda harus membongkar domain.


0
2017-09-18 00:27