在 .NET 中,创建新的 AppDomain 时是不是调用静态构造函数?

Posted

技术标签:

【中文标题】在 .NET 中,创建新的 AppDomain 时是不是调用静态构造函数?【英文标题】:In .NET, are static constructors called when a new AppDomain is created?在 .NET 中,创建新的 AppDomain 时是否调用静态构造函数? 【发布时间】:2010-08-13 07:03:18 【问题描述】:

当我在 C# 中使用 AppDomain.CreateDomain 创建一个新的 AppDomain 时,会在新创建的 AppDomain 中加载组件时调用静态构造函数吗?

相关程序集已加载到当前域中。

【问题讨论】:

好问题。实际上,在您实例化类的对象之前不会调用静态ctor,而不是在加载程序集时。 @jdv:或者如果你访问一个静态成员...... 【参考方案1】:

否 - 静态构造函数只会在第一次访问静态成员或创建实例时调用。

静态构造函数在每个AppDomain 中调用一次,如果这是您所关心的。这不像在不同的AppDomain 中执行过一次,新的AppDomain 中的类型未初始化:)

请注意,类型 没有 静态构造函数的类型初始化器可能比那些 带有 静态构造器的类型更早或更晚执行,并且精确的实现细节changed for .NET 4。

【讨论】:

指向 .NET 4 更改的链接不好【参考方案2】:

查看本站:http://codeidol.com/csharp/net-framework/Threads,-AppDomains,-and-Processes/AppDomains/

摘录如下:

除非您使用诸如线程静态字段之类的东西,否则每个 AppDomain 都包含所有静态字段的副本。所有类(或静态)构造函数都将在给定的 AppDomain 中运行一次。这意味着,如果您在不同的 AppDomain 中加载相同的程序集,每个程序集都将运行类构造函数,并且每个程序集都将包含所有静态字段的单独值。

【讨论】:

以上是关于在 .NET 中,创建新的 AppDomain 时是不是调用静态构造函数?的主要内容,如果未能解决你的问题,请参考以下文章

将套接字传递给新的 AppDomain

在 ASP.NET 中的其他 AppDomain 中运行应用程序

将 log4net 配置文件传递给新的 AppDomain

当实例缺少公共构造函数时,有啥方法可以从 .NET 中的 AppDomain 创建实例?

无法在新的 AppDomain 中创建 UserControl

IIS AppDomain 实例化