2010-03-04 4 views
5

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?

Répondre

0

Dans ce scénario vous devez appeler Marshal.Release sur les IntPtr les variables sinon ils ne vont pas disparaître. Bien sûr, si vous dites au marshaller d'utiliser directement un objet (ou un type spécifique), vous n'aurez pas à vous en soucier car le RCW s'assurera que l'objet sera détruit à un moment donné (c'est-à-dire lorsque le finalizer est appelé le processus de collecte des ordures).

Bien sûr, l'approche finaliseur pourrait arriver à un point non-déterministe dans le temps, donc si l'objet conserve une ressource dont vous avez besoin pour se débarrasser de vous devriez idéalement appeler Marshal.ReleaseComObject décrémente son compteur de référence avant l'emballage libère-t-il pour vous.

Questions connexes