我有一个场景,在应用程序崩溃时,我必须清除某些注册表项。我正在尝试使用Dispose()模式。如果在垃圾收集期间应用程序崩溃,则会调用Dispose来清除注册表???
还有其他模式可以进行此类活动吗?我不能使用未处理的应用程序处理程序,因为我想调用的代码不是由主应用程序直接引用的。我可以使用反射,但不确定这是否是正确的模式。
对此事的任何建议或经验都将非常感激。
答案 0 :(得分:1)
听起来你想在AppDomain.UnhandledException
事件中添加一个事件处理程序,做一些处理(在这种情况下写入注册表),然后让程序死掉。
假设您没有做任何奇怪的事情,比如将您的图书馆加载到另一个AppDomain
,您应该能够以各种方式将其与您的图书馆挂钩。我过去曾使用静态构造函数来挂钩库中的AssemblyResolve
事件。
这样的事情:
public static class CrashHandler
{
public static bool Initialized { get; private set; }
[SecurityPermission(SecurityAction.Demand, Flags=SecurityPermissionFlag.ControlAppDomain)]
static CrashHandler()
{
AppDomain.CurrentDomain.UnhandleException += crash_handler;
Initialized = true;
}
static void crash_handler(object sender, UnhandledExceptionEventArgs args)
{
// do your thing here
}
}
为了让它实际发生,您需要至少在某处读取Initialized
值。将它添加到您的一个库对象的构造函数中,您可以确保它们可以提前实例化。