使用反射在DLL中创建一个类的实例

3

I have the following code:

var type = typeof(PluginInterface.iMBDDXPluginInterface);
var types = AppDomain.CurrentDomain.GetAssemblies().ToList()
    .SelectMany(s => s.GetTypes())
    .Where(p => type.IsAssignableFrom(p));

Type t = types.ElementAt(0);
PluginInterface.iMBDDXPluginInterface instance = Activator.CreateInstance(t) as PluginInterface.iMBDDXPluginInterface;
TabPage tp = new TabPage();

tp = instance.pluginTabPage();

这个dll内的类实现了PluginInterface接口,上面的代码中Type是正确的类/类型,但是当我尝试通过接口创建一个实例时,出现了以下错误信息:

对象引用没有设置到对象的实例。

有人知道原因吗?

谢谢。


3
你在哪一行遇到了这个异常? - decyclone
当我调用instance.pluginTabPage方法时,我就明白了。 - Darren Young
2
你需要一个更好的错误信息 - 将你的 Activator.CreateInstance(t) as Plugin... 改为 (Plugin...) Activator.CreateInstance(t) - Tim Robinson
现在已经修复了...这是我的dll类出错了。谢谢。 - Darren Young
2个回答

3
无论如何
TabPage tp = new TabPage();
tp = instance.pluginTabPage();

没有意义。
做到以下几点:
TabPage tp = instance.pluginTabPage();

同时执行以下操作:

Type type = AppDomain.CurrentDomain.GetAssemblies()
    .SelectMany(s => s.GetTypes())
    .FirstOrDefault(p => type.IsAssignableFrom(p));
if (type != null)
{
    // create instance
}

或者(我更喜欢这种方法):
from asm in AppDomain.CurrentDomain.GetAssemblies()
from type in asm.GetTypes()
where !type.IsInterface && !type.IsAbstract && typeof(ITarget).IsAssignableFrom(type)
select (ITarget)Activator.CreateInstance(type);

感谢您的建议。已经修复了最初的错误 - 这是我的dll类的问题。 - Darren Young

1

尝试在反射器中查看类型。也许构造函数需要参数,而你没有正确地传递给Activator.CreateInstance


那也是我的第一个想法,但如果是这种情况,会抛出MissingMethodException异常,不是吗?http://msdn.microsoft.com/en-us/library/wccyzw83.aspx - Ani
这个类没有参数,它只有一个不带任何参数的默认构造函数。 - Darren Young
我的意思是,也许它有更多的构造函数,而没有参数的构造函数可能会忘记设置一个关键变量,从而导致异常。 - Klaus Byskov Pedersen

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