我有一个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对象完全消失?
答案 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上的信息。