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 服务,因此无法在 ONStartup 事件上编写此代码时进行调试。

我确实在日志中看到“我们比较”行,但是当我们尝试查看 fileformatplugin 得到任何元素时,它的计数保持为 0,并且日志中没有错误行。

有什么建议吗?

4

0 回答 0