无法处理C#COM对象

时间:2010-07-22 18:36:47

标签: c# c++ com dll

我有一个C#类,我已经使ComVisible成为可以在非托管C ++ DLL中使用它。 C#类的定义如下:

public interface IFSFunction
{
    double GetProcessTime();
}

public class Functions : IFSFunction
{
    // Initialization here

    // Interface function
    public double GetProcessTime()
    {
        // Do stuff - return a value
    }
}

然后,在我的C ++ DLL中,我得到了对C#类的引用,如下所示:

IFSFunctionPtr pIFuncs;
pIFuncs.CreateInstance(__uuidof(Functions));
double proctime = pIFuncs->GetProcessTime()
pIFuncs.Detach()->Release();

这非常好地调用了C#函数,但它似乎没有正确清理。似乎还有一个关于我的C#类的引用。如何确保我的C#COM对象完全消失?

2 个答案:

答案 0 :(得分:1)

我猜你正在使用一个调试工具让你看看托管堆。喜欢带有sos.dll的Windbug.exe。是的,在最终的Release()调用之后,您将看到Functions类对象的实例。它是一个遵循正常垃圾收集规则的托管对象。在垃圾收集器运行之前不会收集它。只要您继续运行分配内存的托管代码,它就会一直存在。

答案 1 :(得分:0)

这对你有用吗? (对不起,这是C#而不是C ++)

try
{
    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(pIFuncs);
}
catch (System.Exception ex)
{
    // Do nothing
}
finally
{
    pIFuncs = null;
}

Marshal.FinalReleaseComObject here上的信息。