سؤال

أريد أن الحمل واحد أو أكثر من ملفات Dll بشكل حيوي بحيث يمكن تشغيلها مع مختلف الأمن أو basepath من التطبيق الرئيسي.كيف يمكنني تحميل هذه DLLs في فصل AppDomain ومثيل الأشياء منهم ؟

هل كانت مفيدة؟

المحلول

وبشكل أكثر تحديدا

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

إذا كان كل ذلك يذهب بشكل صحيح (أي استثناءات) لديك الآن مثيل TypeIWantToLoad تحميلها في المجال الجديد الخاص بك.على سبيل المثال لديك هو في الواقع الوكيل (منذ الكائن الفعلي في المجال الجديد) ولكن يمكنك استخدامه تماما مثل العادي الخاص بك الكائن.

ملاحظة:بقدر ما أعرف TypeIWantToLoad أن ترث من MarshalByRefObject.

نصائح أخرى

إذا كنت تستهدف 3.5, يمكنك الاستفادة من الجديد تمكنت التمدد إطار للتعامل مع كل رفع الأحمال الثقيلة بالنسبة لك.

يمكنك استخدام AppDomain.CreateInstance طريقة للقيام بذلك.سوف تحتاج إلى استدعاء بسط طريقة ObjectHandle التي يتم إرجاعها إلى الحصول على الكائن الفعلي.

إنشاء جديد Appdomain مع AppDomain.إنشاء( ...).بعد إنشاء AppDomain تحميل Dll في AppDomain.

نظرت في كل الأساليب التي Appdomain مع خلق*.هناك أشياء معينة مثل CreateInstanceAndUnwrap ، إلخ.

كما ذكر سابقا, استخدام AppDomain.CreateDomain لإنشاء التطبيق الجديد المجال.يمكنك ثم تحميل الجمعية إلى أنه باستخدام طريقة الحمل ، أو حتى تنفيذ الجمعية باستخدام ExecuteAssembly الأسلوب.يمكنك استخدام GetAssemblies لمعرفة ما إذا كانت الجمعية قد تم تحميلها بالفعل.تكون على علم أيضا أنه لا يمكنك تفريغ الجمعية بمجرد تحميله.سوف تحتاج إلى تفريغ المجال.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top