5

不明なインターフェイスで RCW 参照カウントを増やすことはできますか? (つまり、基になる COM オブジェクトの参照カウントではありません)

古い COM サーバー コードがあります。

int Method1(object comobject) {
    try {
        // do something with comobject
        return 0;
    }
    finally {
        Marshal.ReleaseComObject(comobject);
    }
 }

このコードは問題なく動作しますが、別のメソッドから呼び出す必要があります。

int Method2(object comobject) {
    int result = Method1(comobject);
    // Do something with combject
}

comobject のタイプはさまざまです (それがオブジェクトである理由です)。

4

2 に答える 2

10

RCW カウントは、オブジェクトがマーシャリングされた回数をカウントします。追加のマーシャリングを実行することで、この数を増やすことができます。

public static T AddRcwRef<T>(T t) 
{
    IntPtr ptr = Marshal.GetIUnknownForObject(t);
    try {
        return (T)Marshal.GetObjectForIUnknown(ptr);
    }
    finally {
         Marshal.Release(ptr); // done with the IntPtr
    }
}

ReleaseComObjectこの方法の使用をお勧めするかどうかはわかりません。おそらく、通話を取り除こうとする方がよいでしょう。

詳細については、私が書いたテーマに関するこのブログ投稿を参照してください。

于 2010-12-06T20:45:29.837 に答える
1

Marshal.AddRef() メソッドがありますが、間違った参照カウントの変更があります。RCWカウントを直接インクリメントすることは不可能だと確信しています。あなたが陥っている深い穴から抜け出し、古いコードを修正してください。

于 2010-04-22T12:26:23.740 に答える