我写了一个受 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 服务,因此无法在 ONStartup 事件上编写此代码时进行调试。
我确实在日志中看到“我们比较”行,但是当我们尝试查看 fileformatplugin 得到任何元素时,它的计数保持为 0,并且日志中没有错误行。
有什么建议吗?