DLLの記事一覧

2020/04/30

【覚書】プラグイン機能を作る為の手段

最初にインターフェースを作る。

    public interface IStoryEditorPlugin
    {
        /// <summary>
        /// 初期化
        /// </summary>
        /// <returns></returns>
        bool init(string strDllFileName);
        /// <summary>
        /// バージョン情報プロパティ
        /// </summary>
        string Version { get; }
        /// <summary>
        /// コピーライト
        /// </summary>
        string Copyright { get; }
        /// <summary>
        /// ノードを選択された時に、実行される
        /// </summary>
        bool isNodeOpen { get; }
        /// <summary>
        /// 表示用メニュー
        /// </summary>
        /// <returns></returns>
        ToolStripMenuItem menu(string strDllFileName);
        /// <summary>
        /// 
        /// </summary>
        /// <param name="mPluginData"></param>
        /// <returns></returns>
        CStoryEditorPlugin run(CStoryEditorPlugin mPluginData);
        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        DialogResult config(string strDllFileName);
        /// <summary>
        /// 設定項目がある場合に、True
        /// </summary>
        bool isConfig { get; }
        /// <summary>
        /// 設定用のメニューの項目
        /// </summary>
        /// <param name="strDllFileName"></param>
        /// <returns></returns>
        ToolStripMenuItem configMenu(string strDllFileName);
    }


肝になるのが、ToolStripMenuItem を返すところ。本体でロードした時に、メニュー項目に追加される ToolStripMenuItem  を作って返してあげる。これで、プラグインの下準備ができる。

DLLを作って、インタフェースを実装する。

public class CTextFile : IStoryEditorPlugin
{
        public CTextFile()
        {

        }


こんな感じで実装すればいいだけだ。

呼び込み部分は、

            IStoryEditorPlugin plugin = null;
            //
            string[] files = Directory.GetFiles(strBaseFolderName, "*.dll", SearchOption.AllDirectories);
            foreach (string dllFileName in files)
            {
                var asm = Assembly.LoadFrom(dllFileName);
                plugin = null;
                foreach (var tImpl in asm.GetTypes())
                {
                    if (tImpl.IsInterface) continue;
                    try
                    {
                        plugin = Activator.CreateInstance(tImpl) as IStoryEditorPlugin;
                        if (plugin != null)
                        {
                            break;
                        }
                    }
                    catch
                    {
                        //break;
                    }
                }

こんな感じで、DLLを収めているFolderを探して、インタフェースが実装されている場合にはプラグインだとして認識してあげればいいと思う。

後は、創意工夫で乗り切れば大丈夫!