كيف يمكنني تحميل التجميع وجميع تبعياته في وقت التشغيل في C# للتأمل؟

StackOverflow https://stackoverflow.com/questions/59220

  •  09-06-2019
  •  | 
  •  

سؤال

أنا أكتب أداة مساعدة لنفسي، جزئيًا كتمرين لتعلم C# Reflection وجزئيًا لأنني أريد الأداة الناتجة لاستخدامي الخاص.

ما أسعى إليه هو توجيه التطبيق بشكل أساسي إلى التجميع واختيار فئة معينة يمكن من خلالها تحديد الخصائص التي يجب تضمينها في نموذج HTML المُصدَّر كحقول.سيتم بعد ذلك استخدام هذا النموذج في تطبيق ASP.NET MVC الخاص بي كبداية للعرض.

نظرًا لأنني أستخدم كائنات دون سرعة الصوت للتطبيقات التي أرغب في استخدامها، فيجب أن يكون هذا معقولًا واعتقدت أنه من خلال الرغبة في تضمين أشياء مثل اختلاف مخرجات HTML اعتمادًا على نوع البيانات، كان الانعكاس هو الطريقة لإنجاز ذلك.

لكن ما أبحث عنه يبدو بعيد المنال.أحاول أخذ DLL/EXE الذي تم اختياره من خلال OpenFileDialog كنقطة بداية وتحميله:

String FilePath = Path.GetDirectoryName(FileName);
System.Reflection.Assembly o = System.Reflection.Assembly.LoadFile(FileName);

يعمل ذلك بشكل جيد، ولكن نظرًا لأن الكائنات التي تم إنشاؤها بواسطة Subsonic مليئة فعليًا بأنواع الكائنات التي تم تعريفها في Subsonic.dll، وما إلى ذلك، فلا يتم تحميل تلك الكائنات التابعة.يدخل:

AssemblyName[] ReferencedAssemblies = o.GetReferencedAssemblies();

وهذا أيضًا يحتوي بالضبط على ما كنت أتوقعه.ومع ذلك، ما أحاول اكتشافه هو كيفية تحميل تلك التجميعات حتى يعمل البحث في الكائنات الخاصة بي بشكل صحيح.أدرك أنه إذا كانت هذه التجميعات موجودة في GAC أو في دليل الملف القابل للتنفيذ قيد التشغيل، فيمكنني فقط تحميلها باسمها، ولكن من غير المحتمل أن يكون هذا هو الحال بالنسبة لحالة الاستخدام هذه وهي حالة الاستخدام الأساسية الخاصة بي.

لذا، ما يتلخص في كيفية تحميل تجميع معين وجميع تجميعاته العشوائية بدءًا من اسم ملف وينتج عنه شجرة قابلة للتصفح بالكامل من الأنواع والخصائص والأساليب وما إلى ذلك.

أعلم أن أدوات مثل Reflector تفعل ذلك، لكن لا يمكنني العثور على الصيغة اللازمة للوصول إليها.

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

المحلول

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

  1. يرفق الى AppDomain.AssemblyResolve وتفعل آخر LoadFile بناء على التجمع المطلوب.
  2. تدور آخر AppDomain مع الدليل كقاعدة له وتحميل التجميعات فيه AppDomain.

أوصي بشدة بمتابعة الخيار 2، لأنه من المحتمل أن يكون أكثر نظافة ويسمح لك بتفريغ كل تلك التجميعات بعد ذلك.ضع في اعتبارك أيضًا تحميل التجميعات في سياق الانعكاس فقط إذا كنت تحتاج فقط إلى التفكير فيها (انظر Assembly.ReflectionOnlyLoad).

نصائح أخرى

أنا عملت بها كينت بوجارتالخيار الثاني.في الأساس كان علي أن:

1.) تنفيذ ResolveEventHandler في فئة منفصلة، ​​وراثة من MarshalByRefObject وإضافة Serializable يصف.

2.) أضف التيار ApplicationBase, ، حيث يوجد ملف dll الخاص بمعالج الأحداث، إلى ملف AppDomain PrivateBinPath.

يمكنك العثور على الكود على جيثب.

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