COM RCW上的Addref

adr*_*anm 4 com rcw

是否可以在未知接口上增加RCW引用计数?(即不是底层COM对象的引用计数)

我有一些旧的COM服务器代码

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

这段代码工作正常,但现在我需要从另一个方法调用它.

int Method2(object comobject) {
    int result = Method1(comobject);
    // Do something with combject
}
Run Code Online (Sandbox Code Playgroud)

comobject的类型会有所不同(这就是它的对象)

Mot*_*tti 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
    }
}
Run Code Online (Sandbox Code Playgroud)

我不确定我会推荐使用这种方法,尝试摆脱你的ReleaseComObject电话可能更好.

有关进一步阅读,请参阅此博客文章,了解我撰写的主题.


Han*_*ant 2

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