COM RCW上的Addref

COM RCW上的Addref,com,rcw,Com,Rcw,是否可以增加未知接口上的RCW引用计数? (即,不是基础COM对象上的引用计数) 我有一些旧的COM服务器代码 int Method1(object comobject) { try { // do something with comobject return 0; } finally { Marshal.ReleaseComObject(comobject); } } 这段代码运行良好,但现在我需要从另一个方

是否可以增加未知接口上的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的类型会有所不同(这就是它是object的原因)

有Marshal.AddRef()方法,但是错误的引用计数会改变。我很确定直接增加RCW计数是不可能的。将自己从深坑中挖出来并修复旧代码。

有一种方法,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
    }
}
publicstatict AddRcwRef(T)
{
IntPtr ptr=Marshal.getiunknownfobject(t);
试一试{
返回(T)Marshal.GetObjectForIUnknown(ptr);
}
最后{
Marshal.Release(ptr);//使用IntPtr完成
}
}
我不确定我会推荐使用这种方法,最好尝试并摆脱
ReleaseComObject
调用

要进一步阅读,请参阅我写的这篇文章