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 のままで、エラー行はログにありません。
何かアドバイス?