我正在撰写一篇与插件架构相关的研究论文,尝试重新创建这个代码。现在我已经正确完成了所有步骤,并且我的dll文件位于正确的目录下,但是当我运行代码时,我遇到了一个System.NullReferenceException异常。对我来说,这不是一个罕见的异常,但它有些奇怪。通常当我看到这个异常时,我会添加一些断点并查看出现异常的位置,所以我就这样做了,然后我发现,在抛出异常的地方,对象并不为null!有人能解释一下吗?
这是我想运行的代码:
这是被抛出的异常:
不为空的对象:
还有一件事。我认为这可能与'this'尚未初始化有关,但我无法弄清如何在构造函数完成后调用此方法。我尝试使用各种事件来调用我的函数,但它们没有使任何事情变得更好。
[编辑]
主机属性:
这是我想运行的代码:
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](https://istack.dev59.com/PiiHl.webp)
![The object](https://istack.dev59.com/8fbOo.webp)
[编辑]
主机属性:
// 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;
}
plugin.Host = this;
?你确定不是前一行(如果t
为空,则会触发NullReferenceException)或者后一行(plugins
可能为空)吗? - Michael Petrottaplugins
不是 null 吗?有时候我看到调试器在异常中断时会突出显示错误的行,原因我不知道。另一个可能性是Host
setter 抛出了异常,如果那不是你的代码的话。 - phoogRegister
在做什么?试着逐步执行它,十有八九会导致NRE。 - Michael Petrotta