com - COM RCW 上的地址

标签 com rcw

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

最佳答案

一种方式,RCW 计数计算对象已被编码(marshal)的次数,您可以通过执行额外的编码(marshal)来增加此数量。

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我写。

关于com - COM RCW 上的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2689902/

相关文章:

visual-c++ - IXMLDOMDocument 内存泄漏问题

c++ - 我可以保留该指针的拷贝吗?

c# - 无法创建 C# COM 对象(类未注册)

.net - .NET 运行时何时保持 COM 对象的引用计数 > 1?

c# - 在 64 位应用程序中使用 32 位互操作 dll

c# - 在c#中使用dll的问题

com - 什么是 stdole2.tlb

.NET Native 和 RCW 开销

visual-studio-2010 - VS2010 不会显示项目属性 ("underlying RCW")?