System.NullReferenceException - 但是调试器显示值不为空

3
我正在撰写一篇与插件架构相关的研究论文,尝试重新创建这个代码。现在我已经正确完成了所有步骤,并且我的dll文件位于正确的目录下,但是当我运行代码时,我遇到了一个System.NullReferenceException异常。对我来说,这不是一个罕见的异常,但它有些奇怪。通常当我看到这个异常时,我会添加一些断点并查看出现异常的位置,所以我就这样做了,然后我发现,在抛出异常的地方,对象并不为null!有人能解释一下吗?
这是我想运行的代码:
            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);
            }

这是被抛出的异常: The exception 不为空的对象: The object 还有一件事。我认为这可能与'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;
    }

1
哪行代码触发了异常?plugin.Host = this;?你确定不是前一行(如果t为空,则会触发NullReferenceException)或者后一行(plugins可能为空)吗? - Michael Petrotta
2
你确定 plugins 不是 null 吗?有时候我看到调试器在异常中断时会突出显示错误的行,原因我不知道。另一个可能性是 Host setter 抛出了异常,如果那不是你的代码的话。 - phoog
不确定您是否完全理解了phoog的意思:在“Host”设置器中是否有任何奇怪的事情发生? - Michael Petrotta
@MichaelPetrotta,我在问题中添加了Host setter作为参考! - Scuba Kay
2
在setter中确实有一些有趣的东西。Register在做什么?试着逐步执行它,十有八九会导致NRE。 - Michael Petrotta
显示剩余12条评论
1个回答

2
目标站点被列为Boolean Register(Plugin_api.Plugin),因此空引用异常就是在那里抛出的。在plugins.Add方法中设置断点,你会发现你试图放入其中的插件不是null,而是内部支持List的null :)

编辑:看到你的更新后,我发现plugins从所有我能看到的东西来看都是null。plugins是一个简单的List吗?还是一个自定义类?Add方法做了什么?在Register行中设置断点,看看它做了什么。如果你通过静态/全局对象初始化Plugins,可能也会出现Heisenbug(一种在调试器下不出现的错误,因为调试器会改变应用程序的状态),但这只是一个猜测。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接