//起動します 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"); }
/// <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); }