我正在寻找以下解释 - 我有一个正在使用
加载的程序集Assembly assembly = Assembly.LoadFrom(filename);
然后我循环遍历程序集中的所有类型,并希望尝试找出一个类型是否实现了一个特定的接口,如果是这样,我想要一个这种类型的实例,我已经尝试了几个不起作用的东西,但当我回到最基本(也可能是效率低下)的方式时,我意识到有一些更基本的东西我不明白 -
foreach (Type t in assembly.GetTypes())
{
foreach (Type i in t.GetInterfaces())
{
if (i.FullName == pluginInterfaceType.FullName)
{
object o = assembly.CreateInstance(t.ToString());
IInterface plugin = (IInterface)o;
最后一行会导致InvalidCastException,尽管创建的类型肯定会实现该接口。
更多 - 如果我使用Activator.CreateInstance而不是Assembly.CreateInstance(我不想这样做),那么转换到界面就可以了。
答案 0 :(得分:2)
这很可能是因为您所投射的界面与您在课堂上找到的界面不同。
要么是因为一个接口具有相同名称的更多接口,要么因为您将其加载了一次以上。例如,因为它是在动态加载的程序集中定义的,并且您尝试将其强制转换为静态绑定的那个。
答案 1 :(得分:0)
InvalidCastException
应包含更多详细信息,例如“无法将x转换为y”
我的猜测是,你加载的包含IInterface
的程序集与你的代码构建的程序集不完全相同,也许它是一个非强名称程序集的本地副本。