有没有办法监控使用dll的应用程序何时关闭?DLL和应用程序都是使用C#编写的,但都不是Windows窗体。
我可以检查主应用程序何时关闭,但我希望DLL能看到“嘿,程序正在关闭并释放我,我应该在死之前快速做这个事情”。
有什么方法可以做到吗?或者我是否必须让应用程序分发“在你死之前做这个”?
我可以检查主应用程序何时关闭,但我希望DLL能看到“嘿,程序正在关闭并释放我,我应该在死之前快速做这个事情”。
有什么方法可以做到吗?或者我是否必须让应用程序分发“在你死之前做这个”?
AppDomain.ProcessExit
事件适合您?请注意以下内容(来自文档):
与进程关闭时所有终结器的总执行时间一样,所有 ProcessExit 事件处理程序的总执行时间也是有限的。默认值为两秒钟。非托管宿主可以通过使用 ICLRPolicyManager::SetTimeout 方法和 OPR_ProcessExit 枚举值来更改此执行时间。
我们不知道您的代码细节,但是您的类库需要知道进程何时退出这一事实可能表明您的应用程序存在设计缺陷。
如果您需要以确定的方式释放资源或清理其他内容,则应查看 IDisposable
接口。如果您的库公开的类实现了此接口,则调用方可以通过调用 Dispose()
轻松地声明它们不再需要 dll 功能。
进一步阅读的好起点可能是以下文章:
例如,您的类库中可能有以下类:
using System;
using System.IO;
public class ResourceManager : IDisposable
{
private Stream _resource;
private bool _disposed;
public void Dispose()
{
Dispose(true);
// Use SupressFinalize in case a subclass
// of this type implements a finalizer.
GC.SuppressFinalize(this);
}
public void Dispose(bool disposing)
{
if (!_disposed)
{
if (disposing)
{
Console.WriteLine("Exiting Process. Cleaning up.");
// free resources here
if (_resource != null)
_resource.Dispose();
Console.WriteLine("Object disposed.");
}
// Indicate that the instance has been disposed.
_resource = null;
_disposed = true;
}
}
}
using
语句将确保调用Dispose()
方法:using System;
using System.Windows.Forms;
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
using (ResourceManager manager = new ResourceManager())
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}
IDisposable()
场景的典型案例。 - Dirk Vollmarusing
语句不会被执行。 - irvnriirAppDomain.ProcessExit通常可以工作,但如果进程被任务管理器终止,则不能保证触发。因此,如果您的设备驱动程序需要释放大量资源等(即它们可能不会被释放,直到GC处理完为止),则可能不是理想的选择。
有关更多详细信息,请参见Rick Stahls博客。