我正在撰写关于插件架构的研究论文,我正在尝试重新创建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);
}
这是抛出的异常:
非空的对象:
还有一件事。我认为它可能与'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;
}
答案 0 :(得分:2)
TargetSite列为Boolean Register(Plugin_api.Plugin)
,因此抛出NullReferenceException。在plugins.Add
方法中设置断点,看起来您的内部支持列表为空,而不是您尝试插入的插件:)
Edit:
看来我所能看到的所有插件都是空的。插件是简单的List
吗?还是自定义类?添加有什么作用?在该Register行中设置断点并查看它的作用。如果您通过静态/全局对象初始化插件,可能还有一个Heisenbug(调试器下没有出现的错误,因为调试器会改变您的应用程序的状态),但这只是猜测。