c# - 什么时候使用那么多种方法来创建一个类型的实例?

标签 c# .net

我知道这些创建实例的方法:

  • Activator.CreateInstance()
  • AppDomain.CreateInstance()
  • AppDomain.CreateInstanceAndUnwrap()

什么时候使用它们?他们有什么区别? Unwrap 是什么意思?拆开什么?为什么其他两种方法不也解包?

更新

目前,我有以下医学类比:

  • Activator.CreateInstance() = 体外授精
  • AppDomain.CreateInstance() = 自然怀孕/体内授精

关于Unwrap操作,我有一些模糊的感觉,但在更清楚之前我不会发布。

最佳答案

您没有在列表中包含 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 进程通过为每个进程提供一个完全独立的内存 View 来实现这一点,处理器对虚拟内存的支持在很大程度上实现了这一点。 AD 是完全相同的模拟,每个 AD 都有自己的垃圾收集堆和加载程序堆。这允许隔离托管代码块,每个代码块都在自己的 AD 中运行,因此它们不会破坏主机的稳定性。这里的好处是创建 AD 比创建流程便宜很多。对于打败 LAMP 来说非常重要。

正如需要扩展 Windows 在进程之间设置的墙以便它们可以交互一样,.NET 中也有一种方法和需要。 AppDomain.CreateInstance。实际的管道在这里不是很相关,MarshalByRefObject 和按值编码的对象之间的区别非常不透明,也许本身就值得一提。

您列出的两者之间的差异很小。 CreateInstanceAndUnWrap 是一种方便的方法,因为这是您通常想要做的。在另一个 AD 中获取对象的代理引用或副本,最好不要失败。 AppDomain.CreateInstance() 让您首先测试编码(marshal)处理是否成功,避免在 CreateInstance 返回空 ObjectHandle 时解包会导致的异常。

关于c# - 什么时候使用那么多种方法来创建一个类型的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3784235/

相关文章:

C# - LINQ - 对其他表中的字段求和

C# 哈希码返回值

c# - 在没有索引的集合上实现 INotifyCollectionChanged

c# - 何时将某些实体分离到不同的存储库中?

C# 忽略证书错误?

c# - 如何将 int 转换为选择的枚举?

c# - 如何在 ObjectListView 列中显示/放置按钮?

c# - 从 ViewModel 到 Custom-Control 到 ControlTemplate 上的控件的多阶段绑定(bind)不起作用

c# - Windows 商店应用程序中是否有等效的 AppDomain.AssemblyResolve?

.net - PowerShell-为什么不捕获 "Divide By Zero Exception"?