Ejemplo n.º 1
0
        //起動します
        public void Startup()
        {
            //startup.ini を読み込み、プラグインローダーのクラス名を取得します
            var startupIni = new IniFile();

            try {
                startupIni.Load(FileUtils.AppendPath(__.GetAppDirPath(), "plugins/startup.ini"));
            } catch (Exception ex) {
                MessageBox.Show("startup.ini の読み込みに失敗しました。" + ex.Message);
                return;
            }

            //最初に起動するプラグイン(プラグインローダー)のクラス名を取得します
            var pluginLoaderClassName = startupIni["startup", "class_name"];

            if (string.IsNullOrEmpty(pluginLoaderClassName))
            {
                MessageBox.Show("startup.ini の [startup] の class_name が見つかりません。");
                return;
            }

            //クラス名 -> クラスの型
            var pluginLoaderType = GetPluginType(pluginLoaderClassName);

            if (pluginLoaderType == null)
            {
                MessageBox.Show(pluginLoaderClassName + "の型の取得に失敗しました。startup.ini のクラス名を確認してください。");
                return;
            }

            //プラグインを生成します
            var param  = new PluginCreateParam();
            var plugin = CreatePluginInstance(pluginLoaderType, param, this, null, "plugin_loader");
        }
Ejemplo n.º 2
0
        /// <summary>
        /// プラグインのインスタンスを生成します
        ///
        /// 指定したプラグインIDと同じプラグインが既にある場合は、そのプラグインを返します。
        /// </summary>
        /// <param name="pluginType">プラグインのクラスの型</param>
        /// <param name="param">プラグイン生成用パラメーター</param>
        /// <param name="sender">実行元オブジェクト</param>
        /// <param name="parentPlugin">プラグインのコントロールを割り当てるプラグイン</param>
        /// <param name="pluginId">プラグインID。未指定の場合は自動で採番されます。</param>
        /// <returns>生成したプラグイン</returns>
        public IPlugin CreatePluginInstance(Type pluginType, PluginCreateParam param, Object sender, IPlugin parentPlugin = null, string pluginId = null)
        {
            //プラグインID「common」は、プラグイン共通のファイル置き場のため、使用禁止です。
            if ("common".Equals(pluginId))
            {
                throw new Exception("common は予約語のため、プラグインID で使用できません。");
            }

            IPlugin plugin;

            //既に同じプラグインIDのプラグインがある場合は、そのプラグインを返します
            if (pluginId != null)
            {
                plugin = GetPlugin(pluginId);
                if (plugin != null)
                {
                    return(plugin);
                }
            }

            //プラグインの型からインスタンス(オブジェクト)を生成します
            plugin = (IPlugin)Activator.CreateInstance(pluginType);

            //プラグインIDを未指定の場合は生成して設定します
            if (pluginId == null)
            {
                pluginId = GetPluginId();
            }
            plugin.PluginId = pluginId;

            //デフォルトデータフォルダのパスを取得します
            var defineDataPath = GetDefineDataPath(plugin.GetType().FullName);

            //データフォルダのパスを取得します
            var dataPath = GetDataPath(pluginId);

            //データフォルダが存在しない場合は、フォルダを作成します
            if (Directory.Exists(dataPath) == false)
            {
                Directory.CreateDirectory(dataPath);
            }

            //デフォルトデータフォルダとデータフォルダを比較して、
            //デフォルトデータが新しい場合はデータフォルダへコピーします
            FileUtils.CopyDir(defineDataPath, dataPath, FileUtils.FileCopyMode.CopyIfNewer);

            //プラグインを初期化します
            if (param == null)
            {
                param = new PluginCreateParam();
            }
            param.DataPath = dataPath; //データパスを設定します
            try {
                var result = plugin.Initialize(param);

                //初期化に失敗した場合は、プラグインを破棄します
                if (result == false)
                {
                    return(null);
                }
            } catch (Exception ex) {
                MessageBox.Show(ex.Message + "\n" + plugin.GetType().FullName); //TODO ただのログ出力にする
                return(null);
            }

            //プラグインの割り当て
            //プラグインがコンポーネントを持つ場合は、プラグインのコンポーネントを配置します
            if (plugin.GetComponent() != null)
            {
                if (parentPlugin == null)
                {
                    //割当先が未指定の場合
                    //コントロールがフォーム以外か?
                    if ((plugin.GetComponent() is Form) == false)
                    {
                        //フォーム以外の場合
                        //プラグイン生成イベントを発生させて、プラグインの割り当て先を探します
                        var eventParam = new PluginCreatedEventParam {
                            Plugin = plugin
                        };
                        var eventHandledPlugin = _pluginManager.GetEventManager().RaiseEvent(PluginCreatedEventParam.Name, sender, eventParam);

                        //親プラグインを設定します
                        if (eventHandledPlugin != null)
                        {
                            plugin.ParentPlugin = eventHandledPlugin;
                        }
                    }
                }
                else
                {
                    //割当先が指定されている場合
                    if (plugin.GetComponent() is IComponent component)
                    {
                        //指定されたプラグインに対してだけ、プラグイン生成イベントを発生させます
                        var eventParam = new PluginCreatedEventParam {
                            Plugin = plugin
                        };
                        var eventHandledPlugin = _pluginManager.GetEventManager().RaiseEvent(PluginCreatedEventParam.Name, sender, eventParam, parentPlugin);

                        //親プラグインを設定します
                        if (eventHandledPlugin != null)
                        {
                            plugin.ParentPlugin = eventHandledPlugin;
                        }
                    }
                }
            }

            //プラグイン配置後の初期化を行います
            plugin.InitializePlaced();

            //プラグインをリストに追加します
            _pluginList.Add(plugin);

            return(plugin);
        }