3

我正在撰写有关插件架构的研究论文,并且正在尝试重新创建代码。现在我一切正常,我的 dll 文件位于正确的目录中,但是当我运行我的代码时,我得到一个 System.NullReferenceException。在我看来,这不是一个不常见的例外,但有一些奇怪的地方。通常,当我看到这个异常时,我会添加几个断点并查看它在哪里中断,这就是我所做的,然后我发现,在抛出异常的点,对象不为空!有人可以解释一下吗?

这是我要运行的代码:

            string args = Path.GetFileNameWithoutExtension(file);

            Type oType = null;
            try
            {
                Assembly asm = Assembly.LoadFile(file);

                if (asm == null) return;
                Type[] types = asm.GetTypes();
                foreach (Type t in types)
                {
                    // CHECK IF CURRENT TYPE IMPLEMENTS INTERFACE IPlugin
                    if (typeof(IPlugin).IsAssignableFrom(t))
                    {
                        IPlugin plugin = (IPlugin)Activator.CreateInstance(t);
                        plugin.Host = this;
                        plugins.Add(plugin);
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

这是抛出的异常: 例外

不为空的对象:

物体

还有一件事。我认为这可能与尚未初始化的“this”有关,但我不知道在构造函数完成后如何调用此方法。我尝试使用各种事件来调用我的函数,但它们并没有使任何事情变得更好。

[编辑]

主机属性:

// Register the plugin if host is set
    public IPluginHost Host { 
        get
        {
            return host;
        }
        set 
        { 
            host = value;
            host.Register(this); 
        } 
    }

[另一个编辑] 显然代码在 plugins.Add(plugin) 行中中断了!

public bool Register(IPlugin plugin)
    {
        plugins.Add(plugin);
        return true;
    }
4

1 回答 1

2

TargetSite 被列为Boolean Register(Plugin_api.Plugin),所以这就是引发 NullReferenceException 的地方。在您的方法中设置断点,plugins.Add您的内部支持列表似乎为空,而不是您尝试放入其中的插件:)

Edit:在看到您的更新后,我所看到的插件似乎都是 Null。插件简单List吗?还是自定义类?添加是做什么的?在该寄存器行中设置一个断点并查看它的作用。如果您通过静态/全局对象初始化插件,则可能还会出现 Heisenbug(由于调试器会更改应用程序的状态而不会出现在调试器下的错误),但这实际上只是一个猜测。

于 2013-01-17T00:23:52.830 回答