2010-04-13 105 views
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 实例Id)

任何想法可能导致此?

回答

12

的异常指示你得到一个ObjectHandle,这表明你的对象被编,必须解开。

请尝试以下

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

正如您在documentation中看到的那样,此超载会返回包含新实例的ObjectHandle object

ObjectHandle不能直接转换到您的界面。
相反,你需要调用Unwrap method,就像这样:

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

他不会需要转换为'ObjectHandle'第一,以'展开()'? – Jay 2010-04-13 21:29:15

+0

@Jay:不;它被声明为返回ObjectHandle。阅读文档。 – SLaks 2010-04-13 21:55:28