の記事一覧 2020年04月

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を探して、インタフェースが実装されている場合にはプラグインだとして認識してあげればいいと思う。

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

2020/04/21

【バージョンアップ】サイトの更新

各種ドメイン。

https://dotnet.jp/

https://hyperion.biz/

https://mnabe.net/

https://nfox.biz/

の、PHPのバージョンを設定できる最新版に変更しました。同時、MySQLを5.5から5.7に変更しました。

まさか、一日掛かりの作業になるとは思わなかった。

問題は、MySQL5.5 で作っていた一部のデータが5.7に移行すると文字化けしてしまったのだ。最初は、PHPのバージョンの問題だと思って、バージョンを元に戻しても改善しなかった。問題の切り分けを行っていたら、どうやら5.5の時に挿入していたプログラム側に問題があったようだ。VS2010で作っていたプログラムで、フォームの内容をPHPにPOSTで送って、PHPからデータを挿入するだけのものだった。

ここで、文字コードがEUCになっていたのだ。

しかし、DBはUTF8で作られていて、データも問題なく表示できていた。個人的に使っているデータなので、気にしないで使っていた。移行ツールが文字コードを厳密に判定していたようで、何をどうやっても文字化けしてしまったのだ。

解決策を考えること15分。

5.5のデータを一度HTMLに表示させれば、文字化けすることなく表示できる。MySQL5.5(文字化けデータ・・約12万件)→ 一件一件 CSVに変換するPHPのプログラムを作成 → VS2019でWeb情報を取得する → MySQL5.7に文字化けすることなく挿入できるPHPのプログラムを作成 → 挿入した元のMySQL5.5のデータに参照したフラグを付ける。

このプログラムを延々と回した。サーバに負荷がかからないようにしながら状況を注視しながら・・・。

先ほどやっと終わった。

”軽い気持ちで始めた”バージョンアップだったが、大変な目にあってしまった。

そのせいで今日アップ予定の”異世界の物流は俺に任せろ”の【第八章 リップル子爵とアデヴィト帝国】第十六話 ユーラットに寄り道 の公開が2時間遅れてしまった。