3

誰かがタスク マネージャーを使用して、COM オブジェクトをインスタンス化した .NET プロセスを終了する場合、AFAIK では、またはイベント処理ブロックを呼び出す方法はありMarshal.FinalReleaseComObjectませtry {} finally {}using {}

次にアプリケーションを起動すると、COM オブジェクトが使用できない状態になり、再び動作させるにはマシンを再起動する必要があります。

Marshal.BindToMonikerオブジェクトをインスタンス化するために使用します。

私は何を間違っていますか、私が見逃したものはありますか?


Saeedの提案を試しましたが、うまくいきませんでした

private const int WM_CLOSE = 0x0010;

protected override void WndProc(ref Message m)
{
    if (m.Msg == WM_CLOSE)
    {
        logger.Info("WM_CLOSE");
        Marshal.FinalReleaseComObject(comObject);
    }

    base.WndProc(ref m);
}
4

2 に答える 2

1

タスクマネージャーは、ネイティブの同等のProcess.Killもの(またはおそらくさらに強力なもの)を使用しています。ドキュメントからのこの物語に注意してください:

Killプロセスの終了を強制しますが、終了をCloseMainWindow要求するだけです。

..。

呼び出しCloseMainWindowは、メインウィンドウを閉じるための要求を送信します。これは、整形式のアプリケーションでは...

と、

プロセスによって編集されたデータまたはプロセスに割り当てられたリソースは、を呼び出すと失われる可能性がありますKillKillプロセスが異常終了するため、必要な場合にのみ使用してください。

要するに、これを防ぐためにプログラムコード内から実際にできることは何もありません-プラグが抜かれています。ウィンドウメッセージは送信されません。

于 2012-08-21T14:23:21.880 に答える
1

その必要はないかもしれません。ガベージ コレクターは、メモリを解放する段階になると、まだ呼び出されていない Dispose() メソッドがオブジェクトにあるかどうかを確認します。Dispose() メソッドが呼び出されていない場合は、呼び出されます。

これをコンソール アプリでテストしていたところ、Dispose 関数でスピーカーのビープ音が 3 回鳴りました。オブジェクトで Dispose を呼び出さずにアプリケーションを終了した後、ビープ音が 3 回鳴るまでに約 30 秒かかりました。時間は決定的です。

もちろん、オブジェクトは正しくコーディングされている必要があります。

シャットダウン直後にアプリケーションを実行しようとしていますか? 数分待って、動作するかどうかを確認してみませんか?

編集: Dispose 関数に Marshal.FinalReleaseComObject があると仮定しています。

于 2012-08-21T01:24:49.097 に答える