System.NullReferenceException - 但Debugger显示value为非null

时间:2013-01-17 00:05:17

标签: c# visual-studio debugging

我正在撰写关于插件架构的研究论文,我正在尝试重新创建this代码。现在我把一切都搞定了,我的dll文件在正确的目录中,但是当我运行我的代码时,我得到一个System.NullReferenceException。对于我来说,这不是一个不常见的例外,但是有一些奇怪的事情。通常当我看到这个异常时,我会添加几个断点并查看它在哪里断开,这就是我所做的,然后我发现,在抛出Exception的时候,对象不是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); 
        } 
    }

[另一个编辑] 显然代码在插件中断了。添加(插件)行!

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

1 个答案:

答案 0 :(得分:2)

TargetSite列为Boolean Register(Plugin_api.Plugin),因此抛出NullReferenceException。在plugins.Add方法中设置断点,看起来您的内部支持列表为空,而不是您尝试插入的插件:)

看到你的更新后,

Edit:看来我所能看到的所有插件都是空的。插件是简单的List吗?还是自定义类?添加有什么作用?在该Register行中设置断点并查看它的作用。如果您通过静态/全局对象初始化插件,可能还有一个Heisenbug(调试器下没有出现的错误,因为调试器会改变您的应用程序的状态),但这只是猜测。