我正在撰写有关插件架构的研究论文,并且正在尝试重新创建此代码。现在我一切正常,我的 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;
}