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

时间:2013-08-03 12:56:32

标签: c# clr appdomain

是否有卸载事件或任何事件,通知,消息,机制或挂钩,我可以在“默认之前通知“应用程序域已卸载?

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

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

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

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

另见

2 个答案:

答案 0 :(得分:5)

我忘了从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();
   }

   ...
}
  

注意:任何代码都会发布到公共域中。无需归属。

答案 1 :(得分:3)

AppDomain.CurrentDomain.DomainUnload += 
    (object sender, EventArgs e) => { /*do stuff*/ };