メッセージをインターセプトする目的で、オブジェクトを使用して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()が呼び出されてから1秒未満から数分で死ぬだけです。
私の悩みを解決するかもしれないように見えHandleRef
ますが、このコンテキストでそれを使用する方法が不明であり、コードにどのように適合させるかを考えることができません(AppSubclassレベルで宣言してから割り当てる以外は) SpecialAppWndProcオブジェクト。
では、オブジェクトが死ぬ準備ができる前に、オブジェクトが死ぬのを防ぐにはどうすればよいですか?