【问题标题】:How can I handle the exit of the calling application in a class library?如何处理类库中调用应用程序的退出?
【发布时间】:2019-11-18 13:42:48
【问题描述】:

我正在编写一个类库(用于 .Net Framework 4.7.2),其中包含涉及刷新文件的方法。此刷新应在响应直接方法调用时进行,但在调用应用程序提前退出时也应进行。

如果我在 WinForms 应用程序中编写代码,我可以使用

System.Windows.Forms.Application.ApplicationExit += FlushHandler;

向 ApplicationExit 事件添加处理程序并

System.Windows.Forms.Application.ApplicationExit -= FlushHandler;

删除该处理程序。

在类库中,我收到消息:

命名空间中不存在类型或命名空间名称“Forms” 'System.Windows'(您是否缺少程序集引用?)

如何在类库中执行与上述类似的操作,其中要处理的应用程序退出事件是调用 WinForms 应用程序的关闭?

【问题讨论】:

  • 您可以尝试使用 AppDomain 类的 ProcessExit-event;见stackoverflow.com/questions/1119841/…
  • 你为什么要这样做? DLL 库通常包含可由多个应用程序和平台加载的代码。通常它不是为特定于运行时而设计的,它不使用特定于平台的事件。您可以在 DLL 中创建和公开委托,并将其与正在使用它的项目中的事件挂钩
  • 只要您的库仅在 Forms 应用程序中运行,就可以。但正如它所说,你需要add a referenceSystem.Windows.Forms
  • @Fabjan 在这种情况下,DLL 将仅由我正在编写的 WinForms 应用程序使用,因此使其特定于运行时就可以了。

标签: c# .net


【解决方案1】:

如果您使用using FileStream 访问文件,则不必使用单独的FlushHandler

FileStream 将对其处置执行刷新。

【讨论】:

  • 但是如果有人在应用被处理之前关闭了它怎么办?
  • 通常当使用using 块时仍应执行处置。尽管在某些情况下不会执行处置,例如严重的系统崩溃或电源问题。但在这些情况下,您也无法做任何其他事情。
  • 在 Visual Studio 调试器中试用了一段时间后,在应用程序退出时,确实可以正确调用在其他线程中创建的对象的 Dispose 方法,前提是它们是通过 using 语句初始化的。我打算稍后接受这个答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-06
  • 2016-10-08
相关资源
最近更新 更多