3

ユニットテストを行っています。

私のソリューションには 2 つのプロジェクトがあります。1 つはライブラリ プロジェクト、もう 1 つはテスト プロジェクトです。ライブラリ プロジェクトには、いくつかの com コンポーネントがあります。テスト プロジェクトは、ライブラリ プロジェクトの関数をテストしています。これらのライブラリ関数はこれらの com オブジェクトを使用しています。

最初の単体テストは正常に実行されますが、2 つの単体テストを順番に実行しようとすると、2 番目の単体テストで、これらの com オブジェクトにアクセスしようとすると、「基になる RCW から分離された COM オブジェクトは使用できません」というエラーが表示されます。

4

1 に答える 1

1

これは、誰かが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 の相互運用性は、(私の回答で) 追加の詳細があります。

ハッピーコーディング。

于 2012-04-16T08:54:30.640 に答える