【问题标题】:memory leak when using COM IDispatch::GetTypeInfo() in C#在 C# 中使用 COM IDispatch::GetTypeInfo() 时发生内存泄漏
【发布时间】:2010-10-17 22:40:44
【问题描述】:

我在 COM dll(C#、.NET 框架 v2)中有以下功能:

public void Leak(object jsObject) {
    Type comType;
    IDispatch disp = (IDispatch)jsObject;
    disp.GetTypeInfo(0, 0, out comType); // this line causes the leak
    Marshal.FinalReleaseComObject(disp);
    Marshal.FinalReleaseComObject(jsObject);
    disp = null;
    jsObject = null;
    GC.Collect(); GC.WaitForPendingFinalizers();
}

从 JScript 中重复调用此函数时,会泄漏大量内存:

var util = new ActiveXObject('MyLeakyCOM.MyLeakyCOM');

for(var i = 0; i < 1000; i++) {
    util.Leak({});
}

我已经尝试使用while(Marshal.ReleaseComObject(disp) &gt; 0) {} 释放对象,但也没有成功。

【问题讨论】:

    标签: c# com memory-leaks interop managed


    【解决方案1】:

    我是 C++ 人而不是 C# 人,但我觉得你也应该发布 comType:

    Marshal.FinalReleaseComObject(comType);
    

    ITypeInfo 对象是一个正确的 COM 对象,它的 AddRef 将被 GetTypeInfo 的实现调用。

    【讨论】:

    • 不幸的是,这不起作用:它抱怨该对象不是 System.__ComObject 的实例或从中派生的东西。我也试过Marshal.Release(Marshal.GetIUnknownForObject(comType)); - 虽然这不会导致异常,但它没有做任何值得注意的事情。
    • 使用 ITypeInfo 代替 Type 也没有帮助 - 它会导致相同的异常。
    • 嗯。再说一次,我不是 C# 的人,所以这可能不合适,但你可以直接打电话给 Release 吗?像((IUnknown)comType).Release(); 或类似的东西?
    • 不.. 但看起来泄漏是由一些自动生成的组件引起的。使用eggheadcafe.com/software/aspnet/30919888/… 泄漏更少。但是,我决定更改我的代码,这样它就不需要遍历 JS 对象 - 应该早点完成,这样我就不会浪费半天时间来调试泄漏了..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 2018-03-24
    • 2011-05-12
    相关资源
    最近更新 更多