我知道创建实例的这些方法:
何时使用它们?他们有什么不同? Unwrap 是什么意思?打开什么?为什么其他两种方法也没有打开?
目前,我有以下医学类比:
关于Unwrap操作,我有一些模糊的感觉但我不会发布它,直到它更清楚。
答案 0 :(得分:6)
您未在列表中包含Assembly.CreateInstance()。不同之处在于它只会使用Type.FullName来创建对象。您必须为Activator.CreateInstance提供“完全限定的类型名称”,以便它可以找到要加载的正确程序集。如果您已经有装配参考,则取决于。但这些是等价的:
var asm = System.Reflection.Assembly.Load("mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
var obj1 = asm.CreateInstance("System.Object");
var obj2 = Activator.CreateInstance("mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", "System.Object");
AppDomain.CreateInstance()是一个完全不同的球赛。 AppDomains在ASP.NET和SQL Server等自定义CLR主机中非常重要。子集是支持插件的应用程序。 AD类似于Windows中的一个进程,它们隔离了代码块,使它们不会相互破坏稳定性。 Windows进程通过为每个进程提供完全独立的内存视图来实现这一点,并且由处理器对虚拟内存的支持强大启用。 AD是完全相同的模拟,每个AD都有自己的垃圾收集堆和自己的加载器堆。这允许隔离托管代码的块,每个代码都在自己的AD中运行,因此它们不会破坏主机的稳定性。这里的胜利是创建AD比创建进程便宜 lot 。在踢LAMP屁股的过程中非常重要。
正如需要扩展Windows在进程之间建立的墙以便它们可以进行交互一样,.NET中也有一种方式和需求。 AppDomain.CreateInstance。实际的管道在这里并不是很相关,MarshalByRefObject和按值编组的对象之间的差异是非常不透明的,也许它本身就值得提问。
您列出的两者之间的差异很小。 CreateInstanceAndUnWrap是一种方便的方法,因为这是您通常想要做的事情。在另一个AD中获取对象的代理引用或副本,最好不要失败。 AppDomain.CreateInstance()允许您首先测试编组是否成功,避免了当CreateInstance返回null ObjectHandle时解包会导致的异常。
答案 1 :(得分:4)
AppDomain的允许您在单独的应用程序域中创建实例。你必须理解这个概念才能理解为什么会产生影响:http://msdn.microsoft.com/en-us/library/aa719528.aspx
具有解包的那个是一种方便的方法,它执行示例中显示的内容:http://msdn.microsoft.com/en-us/library/system.runtime.remoting.objecthandle.unwrap.aspx。基本上它允许在应用程序域之间进行调用,这需要将初始对象声明为标记为MarshalByRefObject。