在我的代码中,我有一个接口 - 让我们说它的名为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'.
有关可能出现的问题的任何建议?
答案 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();