2012-11-13 100 views
5

在我的代码中,我有一个接口 - 可以说它叫做InterfaceName,它的实现叫做InterfaceImpl。现在,当我尝试动态地使用下面的代码来获得InterfaceImpl无法投射System.Runtime.Remoting.ObjectHandle

object obj = Activator.CreateInstance("ProjectName","ProjectName.Folder.InterfaceImpl"); 
InterfaceName in = (InterfaceName)obj; //Error pops up here 

我收到以下错误

Unable to cast object of type 'System.Runtime.Remoting.ObjectHandle' to type 'ProjectName.Folder.InterfaceName'. 

上可能什么错什么建议?

+1

使用Unwrap()方法。 –

回答

22

If you read the documentation about the method you are calling,它返回

必须解开来访问新创建的实例的句柄。在ObjectHandle文档

看,你只需拨打Unwrap()为了得到你要创建类型的实例。

所以,我想你真正的问题是......为什么?

此方法被设计为在另一个AppDomain中被调用,并且句柄返回到调用AppDomain,其中实例的代理是“解包”的。

什么?这并不能解释为什么?

只有两种类型可以通过AppDomain屏障。可序列化的类型(其中创建了副本)以及延伸MarshalByRefObject(其中代理已创建并通过)的类型。 ObjectHandle延伸MarshalByRefObject,因此可以跨越该障碍,而它们所代表的类型可能不会延伸MBRO 可序列化。无论如何,这种方法可以确保您可以跨越屏障获取该类型的实例。

所以,如果你只是试图实例化一个类型,你可能想看看CreateInstance的一个不同的重载。或者只是打开结果。

var obj = Activator.CreateInstance("A","A.B.C") as ObjectHandle; 
InterfaceName in = (InterfaceName)obj.Unwrap(); 
+0

感谢您的诀窍 –

+2

您还可以使用[CreateInstanceAndUnwrap](http://msdn.microsoft.com/zh-cn/library/3c4f1xde.aspx)在一个步骤中执行同一作业(如果存在缺省构造函数) – Askolein