انعكاس.نت:كيفية تحميل التبعيات؟
-
05-07-2019 - |
سؤال
أحاول إضافة نظام إضافي إلى تطبيق 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.
وشكرا لكم أيها الرجال.
زوجان من الخيارات:
- يمكنك أن تعلق على
AppDomain.AssemblyResolve
لمساعدة CLR في حل التجميع. - يمكنك النظر في عزل الوظائف الإضافية في وظائفها الخاصة
AppDomain
(يرىSystem.AddIn
مساحة الاسم و هذا الموقع).