我正在开发一个插件系统,可以加载包含在指定文件夹中的.dll文件。然后,我使用反射来加载程序集,遍历它们包含的类型,并标识实现我的IPlugin
接口的任何类型。
我正在使用类似于以下代码的代码检查:
foreach(Type t in myTypes )
{
if( typeof(IPlugin).IsAssignableFrom(t) )
{
...
}
}
由于某些原因,IsAssignableFrom()在应该返回true的时候却一直返回false。我曾尝试通过显式地给t
一个应该传递的类型来替换它,它工作得很好,但由于某些原因,它不能处理从加载的程序集返回的类型。让事情变得更奇怪的是,代码在我同事的机器上运行得很好,但在我的机器上就不行了。
有没有人知道任何可能导致这种行为的事情?
谢谢
发布于 2008-12-05 23:05:56
这通常发生在包含当前程序集引用的类型IPlugin的程序集与包含您正在迭代的类型的程序集所引用的程序集之间不匹配时。
我建议你打印出来:
typeof (IPlugin).Module.FullyQualifiedName
和
foreach (var type in t.GetInterfaces ())
{
Console.WriteLine (type.Module.FullyQualifiedName)
}
看看哪里不匹配。
发布于 2012-09-14 23:13:00
有时这是动态程序集引用另一个程序集的问题。
一件简单的事情就是禁用程序集上的本地复制(在visual studio中,右击引用并将copy local设置为false)。这样可以更容易地确定程序集所在的目录。
如果.NET不知道如何初始化类型,你也可以实现一个程序集解析器。
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler([Resolve Function]);
发布于 2008-12-05 22:53:28
我在Java中工作,它有相同的API方法,当我读代码的时候,我就是摸不着头脑(因为某些原因);因此,我总是相反地读它,在你的例子中,"t可赋值给IPlugin“。所以,如果C#有像乔纳森建议的那样" is”,我总是会使用它--当在Java中反映"instanceof“对类对象不起作用,只对对象的实例起作用。
https://stackoverflow.com/questions/345413
复制相似问题