c# - 在 C# 中使用 COM IDispatch::GetTypeInfo() 时发生内存泄漏

标签 c# com memory-leaks interop managed

我在 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) > 0) {} 释放对象,但也没有成功。

最佳答案

我是 C++ 专家而不是 C# 专家,但令我印象深刻的是您也应该发布 comType:

Marshal.FinalReleaseComObject(comType);

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

关于c# - 在 C# 中使用 COM IDispatch::GetTypeInfo() 时发生内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3955619/

相关文章:

c# - `antecedent` 参数的 `Task.ContinueWith` 参数点?

c# - 如何获取 DataGrid 中刚刚编辑的单元格的行索引和单元格索引

c# - 将大型虚拟文件从 C# 拖放到 Windows 资源管理器

c# - 如何在 C# 中返回字符串数组并在非托管 C++ 中使用它?

android - 带有 UI 和内存泄漏的保留 fragment

c++ - function(new Foo()) 之类的函数是否存在内存泄漏?

c# - Windows 窗体内存泄漏

c# - 使用 Reflection.Emit 从派生类调用 BaseClass 中的私有(private)方法

c# - 如何查询这个 XML 文件?

com - 无法使用 COM 加载文件或程序集“Microsoft.Extensions.DependencyInjection.Abstractions”