DLL-larni alohida AppDomain-ga yuklash

Men bir yoki bir nechta DLL-ni dinamik ravishda yuklamoqchiman, shunda ular mening asosiy ilovamga qaraganda boshqa xavfsizlik yoki tayanch yo'l bilan ishlaydi. Ushbu DLL-larni alohida AppDomain-ga qanday yuklashim va ulardan ob'ektlarni yaratishim mumkin?


person Jon Turner    schedule 17.09.2008    source manba
comment
Ilovalar o‘rtasida qo‘ng‘iroq qilishning eng oddiy usuli mumkinmi?   -  person user626528    schedule 14.02.2017
comment
Ko'rsatilgan mumkin bo'lgan dublikatning konteksti boshqacha. Ko'rsatilgan savolda maqsad dasturchi tomonidan yaratilmagan yoki uning nazorati ostida bo'lmagan AppDomain-dagi kodni chaqirishdir. Bu savol, xususan, dasturchi AppDomain xususiyatlarini o'zgartirishi uchun boshqaradigan AppDomain-ga kodni yuklash haqida. Shuningdek, havola qilingan savol, shuningdek, ushbu savolning asosiy komponenti bo'lgan ish vaqtida DLL-ni dinamik ravishda qanday yuklash haqida to'liq kod misolini keltirmaydi.   -  person Jon Turner    schedule 15.02.2017


Javoblar (5)


Aniqrog'i

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

Agar bularning barchasi to'g'ri bajarilgan bo'lsa (hech qanday istisnolarsiz) endi sizda yangi domeningizga TypeIWantToLoad nusxasi yuklangan. Sizda mavjud bo'lgan misol aslida proksi-serverdir (chunki haqiqiy ob'ekt yangi domenda), lekin siz uni oddiy ob'ektingiz kabi ishlatishingiz mumkin.

Eslatma: Men bilishimcha, TypeIWantToLoad MarshalByRefObject-dan meros bo'lishi kerak.

person Jon Turner    schedule 18.09.2008

Agar siz 3.5 ni maqsad qilgan bo‘lsangiz, barchani boshqarish uchun yangi boshqariladigan kengaytiriladigan tizim dan foydalanishingiz mumkin. siz uchun og'ir yuk.

person Community    schedule 17.09.2008
comment
@dboar Xo'sh, u 4.0 da ramkaning bir qismi bo'ladi, lekin AFAIK siz 3.5 da oldindan ko'rishdan foydalanishingiz mumkin (yuklab olish sahifasida ular .net 3.5 va silverlight ikkiliklarini birlashtirgani aytiladi). - person ; 10.02.2010
comment
oh, zo'r... Men hech qachon boshlang'ich kodeks sahifasidan o'tmaganman, chunki ular .Net 4.0 ... bilish yaxshi ... thx - person IAbstract; 10.02.2010

Buning uchun AppDomain.CreateInstance usulidan foydalanishingiz mumkin. Haqiqiy ob'ektni olish uchun qaytariladigan ObjectHandle-ning Unwrap usulini chaqirishingiz kerak bo'ladi.

person Andy    schedule 17.09.2008
comment
Agar namunasini yaratmoqchi bo'lgan ob'ekt men yuklamoqchi bo'lgan assambleyada aniqlangan bo'lsa-chi? Assambleyani avval yuklamasdan turib, ushbu ob'ektning nomi nima ekanligini bila olmayman ... - person lysergic-acid; 06.06.2011
comment
@liortal Bu savolga qabul qilingan javob siz qilishingiz kerak bo'lgan narsani qiladimi? - person Andy; 06.06.2011
comment
Biz DLL to‘plamini boshqa AppDomain-ga yuklamoqchimiz, ammo bu DLL-larda aniqlangan turlar bizga ma’lum emas. - person lysergic-acid; 06.06.2011
comment
@liortal Ushbu AppDomainga DLL faylni yuklash uchun AppDomain.Load() dan foydalanishingiz mumkin. Bu Assambleya misolini qaytaradi, undan siz ushbu yig'ilishdagi istalgan turlarni so'rash uchun foydalanishingiz mumkin. - person Andy; 07.06.2011
comment
Ehtiyotkorlik bilan, Andyning AppDomain.Load() dan foydalanish bo'yicha taklifi ishlashi mumkin, ammo u joriy domenda so'ralgan yig'ilishni ham yuklaydi, bu boshqa domendan foydalanish maqsadini yo'qotadi. Qarang: msdn.microsoft.com/en-us/ library/36az8x58(v=vs.110).aspx - person dhochee; 20.11.2014

AppDomain.Create( ... ) yordamida yangi Appdomain yarating. AppDomain-ni yaratgandan so'ng, DLL-larni ushbu AppDomain-ga yuklang.

Appdomain-ning Create* bilan barcha usullarini ko'rib chiqing. CreateInstanceAndUnwrap va boshqalar kabi ba'zi narsalar mavjud.

person Min    schedule 17.09.2008

Yuqorida aytib o'tilganidek, yangi ilova domenini yaratish uchun AppDomain.CreateDomain-dan foydalaning. Shundan so'ng siz Load usuli yordamida yig'ilishni yuklashingiz yoki hatto ExecuteAssembly usuli yordamida montajni bajarishingiz mumkin. Assambleya allaqachon yuklanganligini ko'rish uchun GetAssemblies dan foydalanishingiz mumkin. Shuni ham yodda tutingki, siz montajni yuklaganingizdan so'ng uni tushira olmaysiz. Domenni yuklab olishingiz kerak bo'ladi.

person Ty.    schedule 18.09.2008