我编写了一个多线程非托管应用程序,它在其工作线程中使用COM对象。一切都很顺利,直到我开始使用导出为COM的.NET对象来完成工作。
使用代码并注释掉.NET对象功能的一部分,我设法将其归结为.NET对象中COM对象的使用。总结一下:
令我惊讶的是,应用程序的内存消耗开始稳步攀升,直到OutOfMemory异常开始出现。
这是我的.NET实现:
void DoSomeWork()
{
IComObject O = new ComObjectClass();
try
{
// do something
}
finally
{
Marshal.ReleaseComObject(O);
}
}
如果我注释掉这个功能,内存泄漏就会消失。如果我在其中调用GC.Collect(),内存泄漏仍然会发生。
关于可能发生的事情的任何想法?
编辑:根据评论和答案提供更多信息:
答案 0 :(得分:2)
可能是您的COM包装器对象需要切换到STA线程来完成。如果你的STA没有泵送消息,这将永远不会发生,因此永远不会调用finalize,从而导致内存泄漏。
this KB中有更多信息。
答案 1 :(得分:0)
您建议您使用以下代码安静。
if (feature != null)
{
while (Marshal.ReleaseComObject(feature) > 0)
{ }
feature=null;
}
如果您使用com对象作为引用类型。恩。光标。 如果你只是在做 对Marshal.ReleaseComObject(O);
它只释放一个引用,其余的引用将保留在内存中,以便更好地释放所有引用。