2

「基礎となるRCWから分離されたCOMオブジェクトは使用できません」というエラーの問題を修正しようとしています.COMオブジェクトがインスタンス化されていないスレッドで使用されていることが原因だと思います.

私は多くのリファクタリングを行うことを許可されていません。オブジェクトは複数のスレッドで使用できる必要があるため、前述のエラーを引き起こす何かを行う前に、現在のスレッドでオブジェクトが作成されているかどうかを確認する方法があるかどうか疑問に思います。まだ作成していない場合は作成します。

また、私はこの相互運用のことは初めてなので、誰かが私を理解するのに十分親切であれば、私はそれを大いに感謝します:

スレッドが終了すると、COM オブジェクトはどうなりますか? また、もう一方のスレッドに COM オブジェクトがなくても RCW を使用できるのはなぜですか (なぜ null ではないのですか?)。また、なぜそのエラーが発生し、同時に Marshal.IsCOMObject で true を返すのでしょうか?

参照カウント、ラッパー、およびメモリを使用した次のシナリオで何が起こるか:

  • スレッド A に COM オブジェクト x を作成する
  • それを渡し、スレッド B に保存します
  • スレッド C に別の x を作成します (または、y の場合はどうなるでしょうか?)
  • それを渡し、スレッド B に x を上書きします
4

1 に答える 1

4

スレッドが終了すると COM オブジェクトがどうなるか

COM オブジェクトは、COM によって自動的に破棄されます。別のスレッドが引き続き使用すると、「分離されたCOMオブジェクト」例外メッセージが生成されます。スレッドの終了を許可できません。

明らかに、最も一般的な種類のシングル スレッド COM サーバーを使用しています。それが作成された STA スレッドとの親和性があります。COM は、別のスレッドで行われたすべての呼び出しを、オブジェクトを作成したスレッドに自動的にマーシャリングします。スレッドがなくなると、それは機能しなくなります。また、並行性が得られないことにも注意してください。

この例外を取得する別の方法は、Marshal.ReleaseComObject() で参照カウントを明示的に処理するという間違いを犯すことです。MDA 警告が表示されるはずだったので、可能性は低いです。

于 2011-04-05T11:59:16.427 に答える