我正在使用一个NativeWindow
对象对非托管窗口的消息泵进行子类化,目的是拦截其消息。
代码结构看起来像这样(它的伪 C#,请原谅小的语法问题):
class AppSubclass : Control {
class SpecialAppWndProc : NativeWindow {
protected override void WndProc(ref Message m) {
switch (m.msg) {
// do stuff
if (SpecialEvent != null) SpecialEvent(x);
}
base.WndProc(ref m);
}
public delegate void SpecialEventHandler(int Xstart);
public event SpecialEventHandler SpecialEvent;
~SpecialAppWndProc() {
DebugTrace("Help! Save me!");
}
}
private SpecialAppWndProc specialAppWndProc = new SpecialAppWndProc();
private void StartMonitoring() {
// do stuff
specialAppWndProc.AssignHandle(hWndUnmanagedWindow);
specialAppWndProc.SpecialEvent += new SpecialAppWndProc.SpecialEventHandler(specialAppWndProc_SpecialEvent);
}
/* ... event handler ... */
public AppSubClass() {
StartMonitoring();
}
}
现在,我认为如果我的对象因 GC 而死,设置一个事件侦听器就足以让垃圾收集器处于停顿状态。如果不是,是否有可能追踪如何以及为什么?我从来不知道.Net会因为代码错误而杀死对象(例外和偶尔的静默失败似乎是事情的一般要点),我不知道主机应用程序如何或为什么(我的应用程序是一个 COM 服务器非托管代码)也有足够的知识来杀死我的对象。
鉴于该对象看似随机死亡(我无法确定一组特定事件,只是它在调用 StartMonitoring() 后不到一秒到几分钟内死亡。
看起来这HandleRef
可能会解决我的问题,但是我不清楚如何在这种情况下使用它,而且我想不出如何将它放入我的代码中(除了可能在 AppSubclass 级别声明一个然后分配它SpecialAppWndProc 对象。
那么,在我准备好让我的对象死亡之前,如何防止它死亡呢?