2010-10-17 41 views
2

je la fonction suivante dans une dll COM (C#, NET Framework v2):fuite de mémoire lors de l'utilisation COM IDispatch :: GetTypeInfo() en C#

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(); 
} 

Lorsque vous appelez cette fonction à plusieurs reprises d'un JScript, il fuit beaucoup de mémoire:

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

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

Je l'ai déjà essayé de libérer l'objet avec while(Marshal.ReleaseComObject(disp) > 0) {} mais aussi pas de chance.

Répondre

1

Je suis un C++ type plutôt qu'un type C#, mais il me semble que vous devriez aussi diffuserons comType:

Marshal.FinalReleaseComObject(comType); 

L'objet ITypeInfo est un objet COM approprié et il est AddRef aura été appelé par la mise en œuvre de GetTypeInfo.

+0

Malheureusement cela ne fonctionne pas: Il se plaint que l'objet ne soit pas une instance de System .__ ComObject ou quelque chose qui en dérive. J'ai aussi essayé 'Marshal.Release (Marshal.GetIUnknownForObject (comType));' - bien que cela ne provoque pas d'exception, il ne fait rien de notable. – ThiefMaster

+0

Utiliser ITypeInfo au lieu de Type n'a pas non plus aidé - il provoque la même exception. – ThiefMaster

+0

Hmmm. Encore une fois, je ne suis pas un gars C# donc ça peut être hors rayon, mais pouvez-vous appeler 'Release' directement? Quelque chose comme '((IUnknown) comType) .Release();' ou similaire? –