反射的铸造误差

时间:2010-04-13 21:14:54

标签: c# reflection interface

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

我有以下代码行,假设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   实例Id)

任何可能导致此问题的想法?

2 个答案:

答案 0 :(得分:12)

该异常表示您收到了ObjectHandle,表示您的对象正在被封送,必须打开。

尝试以下

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

答案 1 :(得分:7)

正如您在documentation中看到的,此重载会返回一个包裹新实例的ObjectHandle object

ObjectHandle无法直接投放到您的界面 相反,您需要调用Unwrap method,如下所示:

IPlugin _plugin = (IPlugin)Activator.CreateInstance(...).Unwrap();