これは、誰かがMarshal.ReleaseComObject
間違って使用しているか、さらに悪いことに、を使用していることを意味しMarshal.FinalReleaseComObject
ます。最初の単体テストは、おそらくティアダウン メソッドで、この関連する副作用を介して 2 番目の単体テストに影響を与えています。これを解決するための最初のステップは、どのオブジェクト/アクセス/場所がその例外を引き起こしているかを正確に見つけることです。
これは、COM オブジェクトが既に解放されている (COM ref-count が 0 に設定されている) RCW でメソッドが呼び出されたために発生します。これは、呼び出された回数ReleaseComObject
が多すぎるかFinalReleaseComObject
、まったく呼び出されていないことを意味します。
RCW オブジェクトを所有しており (「CLR に持ち込んでいる」)、その有効期間が切れている場合は問題ありませんReleaseComObject
(変数を に設定しnull
て、再度使用しないようにします)。それを使用して寿命を正しく追跡することは不可能であるため、FinalReleaseComObject
通常、使用は決して問題ありません。秘訣は、単一の RCW オブジェクトが、COM オブジェクトが "CLR に取り込まれた" ことを1 回以上表し、内部 (非 COM) カウンターを持っていることを覚えておくことです。
多くの場合、GCはファイナライザーの実行時に RCW クリーンアップを正しく処理します。また、RCW に強く到達できないため、例外を生成できません。明示的な使用ReleaseComObject
は、[のみ] COM の有効期間の厳密な制御Dispose
が必要な場合に必要/有用です ( COM オブジェクトの「共有」を考えてください)。これは、Microsoft Office 製品のアドイン開発を扱うときによく出てきます:)
.NET と COM の相互運用性には、(私の回答で) 追加の詳細があります。
ハッピーコーディング。