无法转换System.Runtime.Remoting.ObjectHandle

时间:2012-11-13 18:16:21

标签: c# c#-4.0

在我的代码中,我有一个接口 - 让我们说它的名为InterfaceName,其实现称为InterfaceImpl。现在,当我使用以下代码动态尝试获取InterfaceImpl时:

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 个答案:

答案 0 :(得分:25)

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

  

必须解包才能访问新创建的实例的句柄。

查看ObjectHandle的文档,只需调用Unwrap()即可获取您要创建的类型的实例。

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

此方法旨在在另一个AppDomain中调用,并且句柄返回到调用AppDomain,其中实例的代理是“unwrapped”。

什么?那不解释为什么?

只有两种类型可以越过AppDomain障碍。可序列化的类型(创建了哪些副本),以及扩展MarshalByRefObject(其中代理的创建和传递)的类型。 ObjectHandle扩展MarshalByRefObject,因此可以跨越AppDomain障碍,而他们所代表的类型可能无法扩展MBRO 可序列化。无论如何,此方法都可以确保您可以跨屏障获取该类型实例。

因此,如果您只是尝试实例化一个类型,您可能希望查看CreateInstance的不同重载。或者只是打开结果。

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