【发布时间】:2012-08-05 18:53:14
【问题描述】:
我正在尝试动态加载一些 .dll 文件。文件是插件(目前是自己编写的),其中至少有一个实现MyInterface 的类。对于每个文件,我都在执行以下操作:
Dictionary<MyInterface, bool> _myList;
// ...code
Assembly assembly = Assembly.LoadFrom(currentFile.FullName);
foreach (Type type in assembly.GetTypes())
{
var myI = type.GetInterface("MyInterface");
if(myI != null)
{
if ((myI.Name == "MyInterface") && !type.IsAbstract)
{
var p = Activator.CreateInstance(type);
_myList.Add((MyInterface)p, true);
}
}
}
运行它会导致转换异常,但我找不到解决方法。无论如何,我想知道为什么这根本不起作用。我正在寻找 .NET Framework 3.5 中的解决方案。
发生在我身上的另一件事是在上面的代码中向_myList 添加新条目之前运行以下命令后,在p 中获得了null:
var p = type.InvokeMember(null, BindingFlags.CreateInstance, null,
null, null) as MyInterface;
这段代码是加载插件的第一次尝试,我还没弄清楚为什么p 是null。
我希望有人能引导我走向正确的道路:)
【问题讨论】:
-
这段代码不起作用,x 是什么以及你在哪里初始化它?
-
在上面的代码 sn-p 中,“if (x !=null)”中的“x”真的应该是“myI”吗?
-
您还应该验证该类型是否具有默认构造函数,因为您的代码假定了这一点。
-
我不明白
var myI = type.GetInterface("MyInterface"); if(x != null)。应该是if (myI != null)? -
Activator.CreateInsance(type) 假定存在您的类型的无参数构造函数。你得到什么样的例外?如果是
MissingMethodException,问题(几乎可以肯定)是您的类没有无参数构造函数。
标签: c# interface casting invoke