在我的代码中我有一个接口 - 可以说它被称为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(其中proxies创建并通过)。ObjectHandle
延伸MarshalByRefObject
,所以可以跨越AppDomain
屏障,而它们所代表的类型可能不会扩展 MBROor可序列化。无论如何,此方法确保您可以跨越障碍获取该类型实例。
因此,如果您只是尝试实例化一个类型,您可能需要查看 CreateInstance 的不同重载。或者只是打开结果。
var obj = Activator.CreateInstance("A","A.B.C") as ObjectHandle;
InterfaceName in = (InterfaceName)obj.Unwrap();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)