COM RCW上的Addref

时间:2010-04-22 10:16:19

标签: com rcw

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

2 个答案:

答案 0 :(得分:9)

一种方式,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来电可能会更好。

如需进一步阅读,请参阅我写的blog post on the subject

答案 1 :(得分:1)

有Marshal.AddRef()方法,错误的引用计数改变了。我很确定直接递增RCW计数是不可能的。把自己挖出你所在的深洞并修复旧代码。