在我的代码中,我有一个接口——比方说它叫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'.
有什么可能出错的建议吗?
如果您阅读了有关正在调用的方法的文档,它将返回
必须展开才能访问新创建的实例的句柄。
查看ObjectHandle
的文档,只需调用Unwrap()即可获得要创建的类型的实例。
所以,我想你真正的问题是…为什么?
该方法被设计为在另一个AppDomain
中调用,句柄返回给调用AppDomain
,在那里实例的代理被"展开"。
什么?这还不能解释为什么?
只有两种类型可以跨越AppDomain
屏障。可序列化的类型(创建其副本),以及扩展MarshalByRefObject的类型(生成并传递代理)。ObjectHandle
扩展了MarshalByRefObject
,因此可以跨越AppDomain
屏障,而它们所代表的类型可能不能扩展MBRO或是可序列化的。这种方法确保无论发生什么情况,都可以使该类型实例跨过障碍。
因此,如果您只是试图实例化一个类型,您可能需要查看CreateInstance的不同重载。或者直接打开结果。
var obj = Activator.CreateInstance("A","A.B.C") as ObjectHandle;
InterfaceName in = (InterfaceName)obj.Unwrap();