Récemment, j'ai passé un certain temps à écrire divers projets Visual Studio Extensions. Même si les projets sont tous du code managé pour accéder aux services VS de base, il est toujours nécessaire de travailler avec les anciennes interfaces COM.Directives de comptage des références COM interop
Voici un exemple:
var selectionTracker = (IVsMonitorSelection)serviceProvider.GetService(typeof(SVsShellMonitorSelection));
IntPtr ppHier;
uint pitemid;
IVsMultiItemSelect ppMIS;
IntPtr ppSC;
selectionTracker.GetCurrentSelection(out ppHier, out pitemid, out ppMIS, out ppSC)))
que vous pouvez voir cet appel retourne 2 pointeurs (ppHier et SPPC) et un ppMIS objet. La question est: comment devrais-je jouer au jeu avec le comptage des références COM?
Je crois comprendre que dans le monde COM lorsqu'une méthode renvoie un pointeur vers un objet, ce pointeur est AddRef'ed avant d'être retourné. Ce qui signifie que pour éviter la fuite de l'objet COM, je dois les relâcher quand j'ai fini de les utiliser. Je suppose aussi que ce que je reçois en tant qu'objet est déjà enveloppé dans un RCW, qui s'occupera de la libération de référence quand il sera finalisé. Ces 2 hypothèses appliquées à l'appel ci-dessus signifieraient que je dois m'assurer d'appeler `Marshal.Release 'sur mes 2 pointeurs, mais je ne devrais rien faire sur le comptage des références en ce qui concerne l'objet retourné. Pour reformuler ma question: en supposant que les objets COM que j'utilise jouent selon les règles COM, l'approche ci-dessus est-elle la bonne pour traiter le comptage des références COM?