默认应用程序域的卸载事件?

Posted

技术标签:

【中文标题】默认应用程序域的卸载事件?【英文标题】:Unload event for the default Application Domain? 【发布时间】:2013-08-03 12:56:32 【问题描述】:

是否有 Unload 事件或 any 事件、通知、消息、机制或挂钩,我可以使用它们在 “默认值之前收到通知" 应用程序域已卸载?

我的代码需要知道应用程序域(几乎总是默认域)何时结束。

注意:我不知道开发人员在使用我的代码时会创建什么样的应用程序。可能是:

控制台应用程序 一个 WinForms 应用程序 一个 ASP.net 应用程序 一个 ASP.net 网站 运行时可调用包装器 (RCW) COM 对象 Windows 资源管理器外壳扩展 或 Windows 服务

无论哪种方式,我都需要知道域何时关闭,所以我可以做一些“stuff”。而且我不会要求用户调用任何类型的 "Shutdown""Cleanup" 方法。 (此外,建议要求用户自己调用方法并不能回答问题:这是关于在我正在运行的应用程序域关闭时收到通知)。

另见

Unload event for the default AppDomain? How to get notified before static variables are finalized

【问题讨论】:

所以您正在构建一个将被其他应用程序使用的库,并且您想知道这些应用程序的默认应用程序域何时被卸载? 无法枚举 AppDomain。 @Sniffer 我想知道我所在的 AppDomain(100% 的时间将是默认域)何时被卸载,所以我可以 "shutdown". 好的,我明白了。你看过AppDomain.ProcessExit。从概念上讲,该事件还应该表示 default-AppDomain 的结束(并且也在默认域中引发)。然而,此类事件处理程序的总执行时间是有限的,而且您尝试做的工作听起来相当“参与”。 YMMV。 应该注意 AppDomain.ProcessExit 如果进程通过任务管理器终止,则不会触发。 【参考方案1】:

我忘了从my other slight variation of this question 交叉发布我自己的答案。最终,答案来自an answer by M.A. Hanin。

没有DomainUnload,但是有ProcessExit

class Contoso

   //constructor
   public Contoso()
   
      //...

      //Catch domain shutdown (Hack: frantically look for things we can catch)
      if (AppDomain.CurrentDomain.IsDefaultAppDomain())
         AppDomain.CurrentDomain.ProcessExit += MyTerminationHandler;
      else
         AppDomain.CurrentDomain.DomainUnload += MyTerminationHandler;
   

   private void MyTerminationHandler(object sender, EventArgs e)
   
      //The domain is dying. Serialize out our values
      this.Dispose();
   

   ...

注意:任何代码都会发布到公共领域。无需署名。

【讨论】:

实际上有一个DomainUnload 事件。只是想澄清一下,尽管您这样做的方式实际上更好。【参考方案2】:
AppDomain.CurrentDomain.DomainUnload += 
    (object sender, EventArgs e) =>  /*do stuff*/ ;

【讨论】:

这似乎没有为默认域触发。

以上是关于默认应用程序域的卸载事件?的主要内容,如果未能解决你的问题,请参考以下文章

应用程序域的通信速度是不是比 Windows 服务快

在 NUnit 测试中创建应用程序域的异常

进程线程与应用程序域的区别

检测 JPanel 卸载/关闭事件

接收包安装和卸载事件

为啥我不能使用 jQuery 从卸载事件处理程序触发 AJAX 请求?