我使用Activator.CreateInstance
在我的项目中构建对象。
我已经注意到,根据您调用的CreateInstance
超载情况,您可以获得所请求的对象或ObjectHandle。
这是为什么?这对我来说似乎非常违反直觉。
public static Object CreateInstance( Type type )
public static ObjectHandle CreateInstance( string assemblyName, string typeName )
答案 0 :(得分:1)
如果是
public static Object CreateInstance( Type type )
你有可能实例化一个不是MarshalByRefObject的对象,这意味着它不是代理,而是一个真实的对象。
但是在
的情况下public static ObjectHandle CreateInstance( string assemblyName, string typeName )
有可能,正在创建的对象要么在活动的.net执行上下文中实例化,要么可能将程序集的类型配置为通过底层代理连接到远程对象通过Unwrap()
ObjectHandle
方法返回,可以在另一个AppDomain
中创建远程对象。另一个AppDomain
可以存在于同一个进程中,同一台机器上的不同进程或使用.NET Remoting
的另一台机器上的远程进程。
另一个区别是,ObjectHandle.Unwrap()
返回的代理对象可能有租约时间。如果已过期,则对此代理对象的任何方法调用都将失败!而CreateInstance(Type)
方法返回的对象是真实对象而不是代理。
所以,两种方法都不同。