C# Activator.CreateInstance()重载具有不同的返回类型

C# Activator.CreateInstance()重载具有不同的返回类型,c#,.net,reflection,C#,.net,Reflection,我正在使用Activator.CreateInstance在我的项目中构建对象。 我注意到,根据您调用的CreateInstance重载的不同,您可以得到您请求的对象或一个新的实例 为什么会这样?我觉得这很违反直觉 public static Object CreateInstance( Type type ) public static ObjectHandle CreateInstance( string assemblyName, string typeName ) 取自和,以防 pu

我正在使用
Activator.CreateInstance
在我的项目中构建对象。 我注意到,根据您调用的
CreateInstance
重载的不同,您可以得到您请求的对象或一个新的实例

为什么会这样?我觉得这很违反直觉

public static Object CreateInstance( Type type )

public static ObjectHandle CreateInstance( string assemblyName, string typeName )
取自和

,以防

public static Object CreateInstance( Type type )
您可能正在实例化一个不是MarshalByRefObject的对象,这意味着它不是代理,而是真实的对象

但是万一

public static ObjectHandle CreateInstance( string assemblyName, string typeName )
可能正在创建的对象正在活动的.net执行上下文中实例化,或者可能将程序集的类型配置为通过
ObjectHandle
Unwrap()
方法返回的底层代理连接到远程对象,可以在另一个
AppDomain
中创建远程对象。另一个
AppDomain
可能存在于同一进程中,同一台机器上的不同进程,或者使用
.NET Remoting
在不同机器上的远程进程

另一个区别是,
ObjectHandle.Unwrap()
返回的代理对象可能有租用时间。如果过期,则对此代理对象的任何方法调用都将失败!而
CreateInstance(Type)
方法返回的对象是实对象而不是代理


所以,这两种方法是不同的

我想知道这是否与这样一个事实有关:如果你有一个类型,它会告诉你更多关于对象及其.NET兼容性的信息,而不是给你遗留对象的两个字符串。这是我能想到的唯一真正的区别。因此,拥有ObjectHandle的好处是该类的程序集不必位于活动上下文中?如果在不同的appdomain中创建了真实对象,ObjectHandle可以为您提供该对象的代理。您可以使用RemotingServices.IsTransparentProxy(testObj)检查对象是否是代理。。。false对象意味着它是使用new创建的真实对象。