утечка памяти при использовании COM IDispatch :: GetTypeInfo () в C # - PullRequest
2 голосов
/ 18 октября 2010

У меня есть следующая функция в COM dll (C #, .NET Framework 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) {}, но тоже не повезло.

1 Ответ

1 голос
/ 18 октября 2010

Я парень C ++, а не парень C #, но мне кажется, что вы также должны выпускать comType:

Marshal.FinalReleaseComObject(comType);

Объект ITypeInfo является правильным COM-объектом, и онAddRef будет вызван реализацией GetTypeInfo.

...