スタンドアロンの.exeCOMサーバーと、サーバーのインスタンスを起動してすぐに閉じる簡単なC#テストプログラムがあります。チャームのように機能します。ただし、C#プログラム自体を閉じると、ファイナライザーの実行中に例外が発生します。これは、実行されていないCOMサーバーからCOMイベントシンクの登録を解除/通知しないためです。
例外は
、「mscorlib.dllで発生したSystem.Runtime.InteropServices.InvalidComObjectExceptionタイプの最初の例外」です。
そして、コールスタック:
mscorlib.dll!System.Runtime.InteropServices.ComEventsSink.Unadvise()+ 0x20バイトmscorlib.dll!System.Runtime.InteropServices.ComEventsSink.RemoveAll(System.Runtime.InteropServices.ComEventsSinkシンク)+0x11バイト
mscorlib。 dll!System.Runtime.InteropServices.ComEventsInfo.Finalize()+0x18バイト
サーバーをシャットダウンする前にCOMイベントハンドラーを手動で削除することで、このエラーを修正できます。つまり、myComServer.OnFunkyEvent-= OnFunkyEventHandler; しかし、私はこれがエレガントでなく、エラーが発生しやすく、退屈だと感じています。したがって、問題は、COMイベントのRemoveAll()呼び出しを手動でトリガーして、ファイナライザーで実行されないようにすることはできますか?