在我的代码中,我有一个接口 - 让我们说它的被调用InterfaceName和它的实现调用InterfaceImpl.现在,当我动态尝试InterfaceImpl使用以下代码获取时:
object obj = Activator.CreateInstance("ProjectName","ProjectName.Folder.InterfaceImpl");
InterfaceName in = (InterfaceName)obj; //Error pops up here
Run Code Online (Sandbox Code Playgroud)
我收到以下错误
Unable to cast object of type 'System.Runtime.Remoting.ObjectHandle' to type 'ProjectName.Folder.InterfaceName'.
Run Code Online (Sandbox Code Playgroud)
什么可能出错?
小智 26
如果您阅读了有关您正在调用的方法的文档,则会返回
必须解包以访问新创建的实例的句柄.
查看文档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();
Run Code Online (Sandbox Code Playgroud)