10

在我的代码中,我有一个接口 - 可以说它的调用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'.

关于可能出现问题的任何建议?

4

1 回答 1

31

如果您阅读有关您正在调用的方法的文档,它会返回

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

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

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

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

什么?这不解释为什么?

只有两种类型可以跨越AppDomain障碍。可序列化的类型(创建副本)和扩展MarshalByRefObject的类型(创建并传递 代理)。ObjectHandleextends MarshalByRefObject,因此可以跨越该AppDomain障碍,而它们所代表的类型可能不会扩展 MBRO可序列化。此方法确保您可以通过障碍获得该类型实例,无论如何。

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

var obj = Activator.CreateInstance("A","A.B.C") as ObjectHandle;
InterfaceName in = (InterfaceName)obj.Unwrap(); 
于 2012-11-13T18:28:37.247 回答