使用assembly.CreateInstance创建实例时出现InvalidCastException

时间:2010-04-21 07:23:09

标签: c# reflection

我正在寻找以下解释 - 我有一个正在使用

加载的程序集
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(我不想这样做),那么转换到界面就可以了。

2 个答案:

答案 0 :(得分:2)

这很可能是因为您所投射的界面与您在课堂上找到的界面不同。

要么是因为一个接口具有相同名称的更多接口,要么因为您将其加载了一次以上。例如,因为它是在动态加载的程序集中定义的,并且您尝试将其强制转换为静态绑定的那个。

答案 1 :(得分:0)

InvalidCastException应包含更多详细信息,例如“无法将x转换为y” 我的猜测是,你加载的包含IInterface的程序集与你的代码构建的程序集不完全相同,也许它是一个非强名称程序集的本地副本。