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.
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
Utiliser ITypeInfo au lieu de Type n'a pas non plus aidé - il provoque la même exception. – ThiefMaster
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? –