سؤال

أحاول كتابة البرنامج المساعد النظام لتقديم بعض التمدد إلى تطبيق لي حتى شخص يمكن كتابة البرنامج المساعد(s) من أجل تطبيق دون لمس التطبيق الرئيسي هو رمز (، خطر كسر شيئا).

لدي قاعدة "IPlugin" واجهة مكتوب (الصراف الآلي ، لا شيء يتم تنفيذه حتى الآن)

هنا هو كيف أنا التحميل:

public static void Load()
{
    // rawr: http://www.codeproject.com/KB/cs/c__plugin_architecture.aspx
    String[] pluginFiles = Directory.GetFiles(Plugins.PluginsDirectory, "*.dll");
    foreach (var plugin in pluginFiles)
    {
        Type objType = null;
        try
        {
            //Assembly.GetExecutingAssembly().GetName().Name
            MessageBox.Show(Directory.GetCurrentDirectory());
            Assembly asm = Assembly.Load(plugin);
            if (asm != null)
            {
                objType = asm.GetType(asm.FullName);
                if (objType != null)
                {
                    if (typeof(IPlugin).IsAssignableFrom(objType))
                    {
                        MessageBox.Show(Directory.GetCurrentDirectory());
                        IPlugin ipi = (IPlugin)Activator.CreateInstance(objType);
                        ipi.Host = Plugins.m_PluginsHost;
                        ipi.Assembly = asm;
                    }
                }
            }
        }
        catch (Exception e)
        {
            MessageBox.Show(e.ToString(), "Unhandled Exception! (Please Report!)", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Information);
        }
    }
}

صديق حاول أن تساعد ولكن أنا حقا لا أفهم ما هو الخطأ.

بنية المجلد على الإضافات التالية:

\
\Plugins\

جميع الإضافات مرجع .dll يسمى "Lab.Core.dll" في [الجذر] الدليل غير موجود في الدليل الإضافات بسبب تكرار المراجع التي يجري تحميلها.

نظام المساعد يتم تحميلها من Lab.Core.dll وهو المشار إليه أيضا عن طريق بلدي الملف القابل للتنفيذ.نوع "IPlugin" في Lab.Core.dll وكذلك.Lab.Core.dll هو بالضبط كما يدعى الأساسية من التطبيق.

تحرير:

السؤال:لماذا/ما هو هذا الاستثناء أنا الحصول على كيف يمكن أن تذهب حول تحديد ذلك ؟

تحرير النهائي:

طيب حتى أنا قررت إعادة كتابة ذلك بعد النظر في بعض التعليمات البرمجية المصدر صديق كتب عن TF2 منظم.

هذا ما لدي و هو يعمل:

    public class TestPlugin : IPlugin {
    #region Constructor

    public TestPlugin() {
        //
    }

    #endregion

    #region IPlugin Members

    public String Name {
        get {
            return "Test Plugin";
        }
    }

    public String Version {
        get {
            return "1.0.0";
        }
    }

    public String Author {
        get {
            return "Zack";
        }
    }

    public Boolean OnLoad() {
        MessageBox.Show("Loaded!");
        return true;
    }

    public Boolean OnAllLoaded() {
        MessageBox.Show("All loaded!");
        return true;
    }

    #endregion
}

        public static void Load(String file) {
        if (!File.Exists(file) || !file.EndsWith(".dll", true, null))
            return;

        Assembly asm = null;

        try {
            asm = Assembly.LoadFile(file);
        } catch (Exception) {
            // unable to load
            return;
        }

        Type pluginInfo = null;
        try {
            Type[] types = asm.GetTypes();
            Assembly core = AppDomain.CurrentDomain.GetAssemblies().Single(x => x.GetName().Name.Equals("Lab.Core"));
            Type type = core.GetType("Lab.Core.IPlugin");
            foreach (var t in types)
                if (type.IsAssignableFrom((Type)t)) {
                    pluginInfo = t;
                    break;
                }

            if (pluginInfo != null) {
                Object o = Activator.CreateInstance(pluginInfo);
                IPlugin plugin = (IPlugin)o;
                Plugins.Register(plugin);
            }
        } catch (Exception) {
        }
    }

    public static void LoadAll() {
        String[] files = Directory.GetFiles("./Plugins/", "*.dll");
        foreach (var s in files)
            Load(Path.Combine(Environment.CurrentDirectory, s));

        for (Int32 i = 0; i < Plugins.List.Count; ++i) {
            IPlugin p = Plugins.List.ElementAt(i);
            try {
                if (!p.OnAllLoaded()) {
                    Plugins.List.RemoveAt(i);
                    --i;
                }
            } catch (Exception) {
                Plugins.List.RemoveAt(i);
                --i;
            }
        }
    }
هل كانت مفيدة؟

المحلول

يبدو أنه لديك مرجع دائري.قلت الإضافات الخاصة بك مرجع Lab.Core.DLL ولكن أقول لكم أيضا الإضافات التي يتم تحميلها من Lab.Core.DLL.

أنا سوء فهم ما يحدث هنا ؟

تحرير:حسنا الآن بعد أن كنت قد تم إضافة السؤال على السؤال...

تحتاج إلى أن يكون Lab.Core.DLL الوصول إلى البرنامج المساعد يتم تحميلها لأنه هو التبعية.عادة هذا يعني وجود لها في نفس الدليل أو في GAC.

أظن أن هناك أعمق مسائل التصميم في اللعب هنا ، ولكن هذه المشكلة فورا.

نصائح أخرى

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

http://www.codeplex.com/MEF

تحرير:CodePlex هو الذهاب بعيدا - قانون قد تم نقله إلى جيثب لأغراض الأرشيف فقط: https://github.com/MicrosoftArchive/mef

إلى جانب الإجابة, يمكنني استخدام هذه الواجهات 2 لتنفيذ ذلك

///<summary>
///</summary>
public interface IPlugin {
    ///<summary>
    ///</summary>
    string Name { get; }
    ///<summary>
    ///</summary>
    string Description { get; }
    ///<summary>
    ///</summary>
    string Author { get; }
    ///<summary>
    ///</summary>
    string Version { get; }

    ///<summary>
    ///</summary>
    IPluginHost Host { get; set; }

    ///<summary>
    ///</summary>
    void Init();
    ///<summary>
    ///</summary>
    void Unload();

    ///<summary>
    ///</summary>
    ///<returns></returns>
    IDictionary<int, string> GetOptions();
    ///<summary>
    ///</summary>
    ///<param name="opcion"></param>
    void ExecuteOption(int option);

}



///<summary>
///</summary>
public interface IPluginHost {
    ///<summary>
    ///</summary>
    IDictionary<string, object> Variables { get; }
    ///<summary>
    ///</summary>
    ///<param name="plugin"></param>
    void Register(IPlugin plugin);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top