0

NotePad.NET から着想を得たプラグイン システムを作成しました。このプラグイン システムは、指定されたフォルダー内のすべての DLL ファイルを読み取り、リフレクションを使用してインターフェイスと一致する場合、実行時にそれらを読み込みます。コードは以下です

foreach (string file in System.IO.Directory.GetFiles(dir + "\\plugins\\", "*.dll", System.IO.SearchOption.AllDirectories))
if (file.EndsWith(".dll"))
{
    Assembly dll = Assembly.LoadFrom(file);
    foreach (Type t in dll.GetTypes())
    {
        try
        {
            log.WriteLine("Trying to match " + t.BaseType.FullName + " with " + typeof(Acoustical.PluginBase.FileFormatBase).FullName + " and " + typeof(Acoustical.PluginBase.ReportBase).FullName);
            if (t.BaseType.FullName == typeof(FileFormatBase).FullName)
            {
                log.WriteLine(" we compare for " + t.BaseType.FullName);
                try
                {
                    fileformatPlugin.Add((dynamic)Activator.CreateInstance(t));
                }
                catch (Exception ex)
                {
                    log.WriteLine("Error in loading File Plugin ::" + ex.Message + "\r\n" + ex.StackTrace);
                }
                continue;
            }
            else if (t.BaseType.FullName == typeof(ReportBase).FullName)
            {
                log.WriteLine(" we compare for " + t.BaseType.FullName);
                reportPlugin.Add((dynamic)Activator.CreateInstance(t));
                continue;
            }
        }
        catch (Exception ex) {
            log.WriteLine("Error in loading Plugin ::" + ex.Message + "\r\n" + ex.StackTrace);
        }
    }
    dll = null;
}

上記のコードは、フォルダー内で見つかったすべてのファイルを反復処理してからロードする部分を示しています。

上記のコードは、Windows フォームまたは WCF インターフェイス アプリケーションを使用している場合に機能します。Windows サービスで機能しますが、それを保証するものではありません。再コンパイル時の 60 ~ 70% の時間はプラグインをロードしません。その後、10 ~ 15 回試みた後、プラグインをロードするか、1 ~ 2 個のプラグインのみをロードすることがあります。

ご覧のとおり、ほとんどすべての行に Try catch を配置して、エラーが発生している場所を追跡しますが、エラーは表示されません。Windows SErvice のため、ONStartup イベントでこのコードを書くとデバッグできません。

ログに "We compare for" 行が表示されましたが、fileformatplugin が要素を取得したことを確認しようとすると、カウントは 0 のままで、エラー行はログにありません。

何かアドバイス?

4

0 に答える 0