有没有办法监控使用dll的应用程序何时关闭? DLL和应用程序都是C#,也不是Windows Forms。
我可以检查主应用程序何时关闭,但我希望DLL能够看到“嘿,程序正在关闭并释放我,我应该在死之前快速做到这一点。”
有什么办法吗?或者我不知道应用菜单“在你死之前做这个”吗?
答案 0 :(得分:8)
也许AppDomain.ProcessExit
事件会对你有用吗?请注意以下内容(来自文档):
所有人的总执行时间 ProcessExit事件处理程序有限, 就像总的执行时间一样 所有终结者在过程中都是有限的 关掉。默认值为两秒。 非托管主机可以更改此设置 通过调用执行时间 ICLRPolicyManager::SetTimeout方法 使用OPR_ProcessExit枚举 值。
答案 1 :(得分:1)
我们不知道您的代码的详细信息,但您的类库需要知道该进程何时退出可能表明您的应用程序存在设计缺陷。
如果您需要以确定的方式释放资源或清理其他内容,您应该查看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());
}
}
}
答案 2 :(得分:0)
AppDomain.ProcessExit将“正常”工作但如果某个进程被任务管理器终止,则不会被激活。因此,如果您的设备驱动程序需要释放大量资源(例如,它们可能无法释放,直到GC了解它),这可能并不理想。
有关详细信息,请参阅Rick Stahls blog。
答案 3 :(得分:0)
如果是控制台应用程序,则需要在this question中作为接受的答案进行操作。
最好使用IDisposable
接口进行开发。