ServiceBase クラスを C# で派生させて Windows サービスプログラムを実装します。サービスは、OnStart() でバックグラウンド スレッドを使用してアセンブリを読み込み、InvokeMember() 呼び出しによって関数エントリ ポイントから開始します。アセンブリ dll/バックグラウンド スレッド内で、プログラムは実行中にさまざまなシステム リソースを割り当てます。問題は、OnStop() が NOP として実装されているため、使用できるフックがないことです。OnStop() 実装を変更せずに、「sc stop aService」によってサービスが停止されたときに、割り当てられたリソースをクリーンアップするにはどうすればよいですか?
さまざまな方法を試しましたが、OnStop() を変更する以外に「sc stop」メッセージを傍受する方法がないようです。バックグラウンド クリーンアップ スレッドで try/catch/finally ブロックを追加しようとしましたが、finally 句を呼び出すことができません。AppDomain UnhandledException および ProcessExit ハンドラーを試してみましたが、何もしませんでした。では、バックグラウンド スレッドに対する SERVICE_CONTROL_STOP(sc stop) の影響は何ですか? とにかく、アセンブリ/dll 内のリソースをクリーンアップできるものはありますか?