سؤال

أحاول إضافة نظام إضافي إلى تطبيق Windows.Net الخاص بي باستخدام Reflection؛لكنه يفشل عندما يكون هناك ملحق مع التبعية.

يجب أن تقوم فئة Addon بتنفيذ واجهة "IAddon" وأن يكون لها مُنشئ فارغ.
يقوم البرنامج الرئيسي بتحميل الملحق باستخدام الانعكاس:

Assembly assembly = Assembly.LoadFile(@"C:\Temp\TestAddon\Addon.dll");
Type t = assembly.GetType("Test.MyAddon");
ConstructorInfo ctor = t.GetConstructor(new Type[] { });
IAddon addon= (IAddon) ctor.Invoke(new object[] { });
addon.StartAddon();

إنه يعمل بشكل رائع عندما لا يستخدم الملحق التبعية.ولكن إذا أشار الملحق الخاص بي واستخدم ملف DLL آخر (C: emp estAddon\MyTools.dll) تم حفظه بالقرب من الملحق الموجود في القرص، فسيفشل:
System.IO.FileNotFoundException:تعذر تحميل الملف أو التجميع "MyTools.dll" أو أحد تبعياته.

لا أرغب في نسخ ملف DLL الإضافي بالقرب من ملفي القابل للتنفيذ، كيف يمكنني أن أفعل لإخبار .Net runtime بالبحث في "C: emp estAddon\" عن أي تبعية؟

لاحظ أن إضافة

Assembly assembly = Assembly.LoadFile(@"C:\Temp\TestAddon\MyTools.dll");

لا تغير شيئا.

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

المحلول

إذا <م> MyTools.dll يقع في نفس الدليل ك <م> Addon.dll ، كل ما عليك القيام به هو دعوة Assembly.LoadFrom بدلا من Assembly.LoadFile لجعل عمل التعليمات البرمجية. خلاف ذلك، والتعامل مع الحدث AppDomain.AssemblyResolve هو الطريق للذهاب.

نصائح أخرى

هل بحثت في استخدام حاوية تحكم ؟ أنا استخدم قلعة وندسور مع ملف بو الخارجي الذي يتيح لي بسهولة تمديد applcation دون الحاجة إلى إعادة ترجمة أو تقلق بشأن توريد تبعيات

يمكنك استخدام الانعكاس للوصول إلى القطاع الخاص Assembly._GetReferencedAssemblies().

على الرغم من أن الطريقة استطاع تغيير في إصدار مستقبلي من إطار عمل .NET، لا يبدو ذلك مرجحًا — يعتمد ASP.NET عليه بشكل كبير، على الرغم من أنه من الممكن نقله من mscorlib ل System.Web وهو التجميع الوحيد الذي أعرفه حيث تتم الإشارة إلى الطريقة.

وAssembly.LoadFrom يعمل بشكل جيد حتى وأنا أحاول أن استخدام خدمة ويب في بلدي الملحق، وكان له " غير قادر على تحويل كائن من نوع 'X' كتابة 'X' " استثناء.

وانها قبيحة، ولكن أنا سوف تستخدم Assembly.LoadFile مع AppDomain.AssemblyResolve.

وشكرا لكم أيها الرجال.

زوجان من الخيارات:

  1. يمكنك أن تعلق على AppDomain.AssemblyResolve لمساعدة CLR في حل التجميع.
  2. يمكنك النظر في عزل الوظائف الإضافية في وظائفها الخاصة AppDomain (يرى System.AddIn مساحة الاسم و هذا الموقع).
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top