无法强制转换System.Runtime.Remoting.ObjectHandle



在我的代码中,我有一个接口——比方说它叫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(); 

相关内容

最新更新