سؤال

أريد إعداد مثل هذا:

+- /ApplicationFolder
  -- App.exe
  -- Core.dll
  -- AnotherShared.dll
  +- /PluginsFolder
    -- plugin1.dll
    -- plugin2.dll

ولكن نظرًا لأن plugin1.dll يشير إلى Core.dll وShared.dll عندما أقوم بتجميع التطبيق، فإنه يسقط نسخة من "Copy.dll" و"Shared.dll" إلى مجلد المكونات الإضافية أيضًا وإذا قمت بإزالتها فلن يعمل أي أكثر من ذلك.

كيف يمكنني حل هذه المشكلة؟

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

المحلول

وعند إنشاء AppDomain يمكنك تحديد مسار للجمعيات التحميل. تعيين <لأ href = "http://msdn.microsoft.com/library/system.appdomainsetup.privatebinpath". يختلط = "noreferrer" عنوان = "MSDN"> AppDomainSetup.PrivateBinPath وتمريرها إلى نطاق AppDomain.Create.

وباستخدام AppDomain هو فكرة جيدة لالإضافات (والتي تسمح CAS مختلفة والتفريغ).

لتجنب VS / msbuild المجالس النسخ المشار إليها إلى دليل الإخراج، تغيير "نسخ محلية" إلى false في خصائص الإشارة.

نصائح أخرى

وتعيين طلبي MEF تصل حتى تجميع أن مشاريع البرنامج المساعد لمجلد الخاصة بهم (كما هو الافتراضي)، ثم استخدام أمر بعد بناء لنسخ الملفات المحددة إلى مجلد ملحقات الانتاج.

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

يمكنك تجربة هذا: كيف يمكنني تعيين PrivateBinPath في MEF؟

أو يمكنك محاولة التعامل مع الحدث Appdomain.AssemblyResolve الذي يتم رفعه في أي وقت يتعذر على net تحديد موقع التجميع.هناك يمكنك تنفيذ منطق مخصص لتحديد موقع التجميعات وتحميلها من أي مكان.

يقوم معالج أحداث AssemblyResolve jsut بإرجاع إما التجميع الذي يتم البحث عنه أو أنه فارغ، لذا يمكنك إرجاع Core.dll المحمل بالفعل من طريقة AppDomain.GetAssemblies().

ومع ذلك، في حالتك، لا بأس من عدم تضمين Code.dll مع plugin1.dll، ويجب أن يدرك .net بالفعل أنه تم تحميل Core.dll ويستخدم هذا المثيل

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