COM オブジェクトでイベントを処理するために匿名メソッドを使用しています。プログラムが終了すると、監視していたすべてのリソースに対して最初の例外 (InvalidComObjectException) が発生するという点で、匿名メソッドで使用しているリソースが「正しく閉じられていない」ように見えます。これは大したことではないと思いますが、「正しい」とは感じません。
匿名メソッドの範囲外でキャプチャされた変数にアクセスする方法を理解することはできません(とにかく、できるはずはありません)。アプリケーションを終了する前にリソースを閉じる/破棄するにはどうすればよいですか?
編集: 簡単に読み直した後、ここで何をしているのかはっきりしないかもしれません。COM オブジェクトを使用するマネージ アプリケーションを作成しています。
さらに編集: ArcGIS Engineを使用して GIS データを操作しています。この特定のケースでは、ILayerEvents_Event の VisibilityChanged イベントを使用して、GIS レイヤーがいつ表示または非表示になるかを監視しています。イベントはブール値 (可視または不可視) のみを渡し、レイヤー名は渡さないため、可視状態の変更を作成するには、レイヤーごとにメソッドを作成する必要があります。私は動的レイヤーを扱っているので、何らかの形でこれを動的に行う方法が必要だったので、匿名メソッドが必要でした。
anonymoua メソッド内に、(ILayer コンテキスト内の) 外側のループから ILayerEvents_Event を取得する ILayer 変数があるため、どのレイヤーを使用しているかがわかります。私が立ち往生しているのはこの時点です。機能は機能し、アプリケーションを終了するまですべてが壮大で、20 以上の参照がそこにぶら下がっていて、行く場所がなく、例外があります。
ユーザーが最後にレイヤーを非表示/表示する時期がわからないため、最後に物事を無効にする方法はありません。何も害がないように見えるので、そのままにしておくことができると思います(または、匿名メソッドよりもこれを行うためのより良い方法があるかもしれません)。何かが足りないと思うだけです。