我有一个简单的dll。我使用'interface'将我的dll加载到我的主应用程序中。问题是我想要dll有表单,所以我在dll项目中添加了一个新表单。但每当我将我的DLL加载到主应用程序并尝试调用任何方法时,我得到:null异常:
..
Type[] pluginTypes = Assembly.LoadFile(s).GetTypes();
foreach (Type t in pluginTypes){
M.ModuleInterface module = Activator.CreateInstance(t) as M.ModuleInterface;
module.ReadAll(); // exception
}
// Exception I'm getting
t.GenericParameterAttributes' threw an exception of type 'System.InvalidOperationException'
如果我从dll中删除表单,则异常消失并且一切正常。如何添加表单并修复此异常?谢谢!
答案 0 :(得分:3)
这可能是因为并非您的dll中的所有类型都实现了ModuleInterface
接口。
试试这个:
Type[] pluginTypes = Assembly.LoadFile(s).GetTypes();
foreach (Type t in pluginTypes)
{
if(t.GetInterfaces().Contains(typeof(ModuleInterface)))
{
var module = (ModuleInterface)Activator.CreateInstance(t);
module.ReadAll(); // exception
}
}
答案 1 :(得分:0)
我认为这是因为你没有在dll方法中初始化表单。尝试将表单作为参数传递。
答案 2 :(得分:0)
在循环之前,您应该过滤所需类型的所有元素:
foreach(Type t in pluginTypes.Where(type=>typeof(M.ModuleInterface).IsAssignableFrom(type))){
M.ModuleInterface module = Activator.CreateInstance(t) as M.ModuleInterface;
module.ReadAll();
}