0

次のコードでアプリケーションを閉じると、InvalidComObjectException が発生します。

class MyExcelManager
{
  myExelAppInstance = new Excel.Application();

  // finalizer
  ~MyExcelManager()
  {
    myExelAppInstance.Quit(); // InvalidComObjectException thrown here
    myExelAppInstance = null;
  }
}

何故ですか?COM オブジェクトを破棄するためにファイナライザを使用すべきではありませんか?

4

1 に答える 1

1

ファイナライザーはオブジェクトを破棄しません。とにかく、Excel.ApplicationインターフェイスにはDisposeメソッドがありません。問題は、ファイナライザーが実行されるまでに、RCWのファイナライザーがすでに実行されていることです。これは仕様によるものであり、ファイナライザーの順序は決定論的ではありません。

未処理のインターフェイスがすべて解放されると、Excelはすでに自動的に終了します。これは、RCWのファイナライザーによって行われます。助けないでください。とにかく助けたい場合は、次のように書いてください。

class MyExcelManager : IDisposable
{
  void Dispose()
  {
    myExelAppInstance.Quit();
  }
}

クラスのクライアントは、そのDispose()メソッドを呼び出す必要があります。

于 2010-09-10T17:16:37.330 に答える