使用反射时出现转换错误

7

我有一个应用程序,使用由接口管理的插件。然后我动态加载插件类并将其强制转换为接口以便使用它们。

我有以下代码行,假设IPlugin是我的接口。

IPlugin _plugin = (IPlugin)Activator.CreateInstance(oInfo.Assembly, oInfo.FullyQualifiedName)

这应该很简单,创建实例并将其转换为接口。我知道程序集和完全限定名称的值是正确的,但我遇到了以下异常。
异常= System.InvalidCastException:无法将类型为“System.Runtime.Remoting.ObjectHandle”的对象强制转换为类型“ MyNamespace.Components.Integration.IPlugin”。 在MyNamespace.Components.Integration.PluginProxy..ctor(Int32 instanceId)
有什么想法是什么原因引起的吗?
2个回答

12

这个异常表示你正在获取一个ObjectHandle,这表明你的对象正在进行封送并且必须被拆开。

尝试以下操作:

ObjectHandle marshaled_plugin = (ObjectHandle)Activator.CreateInstance(oInfo.Assembly,  Info.FullyQualifiedName);
IPlugin plugin = (IPlugin)marshaled_plugin.Unwrap();

7
正如您在文档中所看到的,此重载返回一个包装新实例的ObjectHandle对象ObjectHandle不能直接转换为您的接口。
相反,您需要调用Unwrap方法,像这样:
IPlugin _plugin = (IPlugin)Activator.CreateInstance(...).Unwrap();

他不需要先转换为“ObjectHandle”,才能使用“Unwrap()”吗? - Jay
@Jay:不是的;它被声明为返回 ObjectHandle。请阅读文档。 - SLaks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接