【问题标题】:Addref on COM RCWCOM RCW 上的地址
【发布时间】:2010-04-22 10:16:18
【问题描述】:

是否可以在未知接口上增加 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 的原因)

【问题讨论】:

    标签: com rcw


    【解决方案1】:

    一种方法,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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-29
        • 2012-12-25
        • 2016-07-23
        • 1970-01-01
        • 1970-01-01
        • 2011-11-21
        • 2012-04-27
        • 1970-01-01
        相关资源
        最近更新 更多