كيفية استخدام مففمكروس الإضافات في الروبوت دون تجميع دلل?

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

  •  20-12-2019
  •  | 
  •  

سؤال

لدي مشكلة في استخدام بلدي الإضافات مففمكروس في مشروع الروبوت ، لأن PluginLoader يبدو أن نتوقع .Droid.dll من مساحة الاسم بالضبط هو في.

لنفترض أن لدي ثلاثة مشاريع مع هذا المجلد وهيكل مساحة الاسم:

MyApp.Core:
    Plugins/Settings/ISettings.cs
    Plugins/Settings/PluginLoader.cs
MyApp.Droid:
    Plugins/Settings/Settings.cs
    Plugins/Settings/Plugin.cs
    Bootstrap/SettingsPluginBootstrap.cs
MyApp.Touch:
    Plugins/Settings/Settings.cs
    Plugins/Settings/Plugin.cs
    Bootstrap/SettingsPluginBootstrap.cs

يعمل مشروع دائرة الرقابة الداخلية تماما كما هو متوقع ، ويجد البرنامج المساعد دون مشكلة.

مشروع الروبوت من ناحية أخرى ، فشل مع استثناء: Could not load file or assembly 'MyApp.Plugins.Settings.Droid.dll' or one of its dependencies.

إذا قمت بتغيير مساحة الاسم من PluginLoader من عند MyApp.Core.Plugins.Settings ببساطة MyApp, ، يعمل البرنامج المساعد;أعتقد أنه يبحث عن MyApp.dll ويجد ذلك.ومع ذلك ، إذا كان لدي العديد من المكونات الإضافية في تطبيقي ، فيجب أن يكون لكل منها مساحة اسم خاصة به، ولا يمكن أن تكون جميعها في MyApp مساحة الاسم.

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

لماذا PluginLoader الإصرار على البحث عن <PluginLoader namespace>.Droid.dll ملف على الروبوت ، عندما PluginLoader على دائرة الرقابة الداخلية يجد البرنامج المساعد دون أي مشكلة?

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

المحلول

تم تصميم مففمكروس الإضافات للعمل كطبقة أساس التجمع على رأس أوك.

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

السبب في دائرة الرقابة الداخلية (وماك) استخدام نظام تحميل البرنامج المساعد مختلفة قليلا لأن مترجم أوت مونوتش لن تسمح ديناميكية Assembly.Load تحميل.

وبسبب هذا دائرة الرقابة الداخلية لديها لاستخدام نوع مختلف من PluginManager ونوع مختلف من Bootstrap الطبقة إلى منصات أخرى.هناك المزيد من المعلومات حول هذا في "كيف يتم تحميل المكونات الإضافية" في https://github.com/MvvmCross/MvvmCross/wiki/MvvmCross-plugins#how-plugins-are-loaded


إذا كنت ترغب في إضافة Loader اكتب التسجيل المساعد لالروبوت وكذلك دائرة الرقابة الداخلية ، ثم أعتقد أنك يمكن أن تفعل هذا في العرف PluginManager ويمكن بعد ذلك إنشاء هذا أثناء الإعداد باستخدام تجاوز protected override IMvxPluginManager CreatePluginManager().

شيء من هذا القبيل:

public class MyPluginManager : MvxFilePluginManager, IMvxLoaderPluginManager
{
    private readonly Dictionary<string, Func<IMvxPlugin>> _finders = new Dictionary<string, Func<IMvxPlugin>>();

    public MyPluginManager(string platformDllPostfix, string assemblyExtension = "") : base(platformDllPostfix, assemblyExtension)
    {
    }

    public IDictionary<string, Func<IMvxPlugin>> Finders
    {
        get { return _finders; }
    }

    protected override IMvxPlugin FindPlugin(Type toLoad)
    {
        var pluginName = toLoad.Namespace;
        if (string.IsNullOrEmpty(pluginName))
        {
            throw new MvxException("Invalid plugin type {0}", toLoad);
        }

        Func<IMvxPlugin> finder;
        if (_finders.TryGetValue(pluginName, out finder))
        {
            return finder();
        }

        return base.FindPlugin(toLoad);
    }
}

تمت تهيئته في الإعداد باستخدام:

    protected override IMvxPluginManager CreatePluginManager()
    {
        return new MyPluginManager(".Droid", ".dll");
    }

ثم تحتاج إلى التأكد من أن الخاص بك loader تستخدم الإضافات القائمة فئات التمهيد القائمة على الخروج من MvxLoaderPluginBootstrapAction و لا MvxPluginBootstrapAction


كبديل آخر ، إذا لم تكن مهتما بإعادة استخدام المكونات الإضافية بشكل فردي - إذا كنت تفضل عدم شحن الكثير من تجميعات المكونات الإضافية الفردية - فيمكنك وضع جميع الواجهات والتطبيقات في مجموعة واحدة - ويمكنهم بعد ذلك مشاركة واحدة Bootstrap, Plugin و PluginLoader بينهما.


كبديل نهائي ، لاحتياجاتك المخصصة ، يمكنك دائما التفكير في استخدام فئات التمهيد المخصصة الخاصة بك-المعيار Setup سوف تخلق و Run أي فئة قابلة للبناء في تجميع واجهة المستخدم الخاص بك والتي تنفذ IMvxBootstrapAction - حتى تتمكن من استبدال SettingsPluginBootstrap مع بعض العرف Run العمل الذي يناسب احتياجات التطبيقات الخاصة بك.

public class SettingsBootstrapAction
    : IMvxBootstrapAction
{
    public void Run()
    {
        // my stuff here
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top