Quand le temps d'exécution .NET tenir un compte de référence> 1 pour les objets COM?

StackOverflow https://stackoverflow.com/questions/2567236

  •  24-09-2019
  •  | 
  •  

Question

Jusqu'à récemment, je croyais que le temps d'exécution .NET ne fait qu'accroître le nombre de références d'objets COM par 1 lors de la création d'un wrapper runtime-appelable , et que seule une telle enveloppe de runtime-appelable est créée pour un objet COM donné.

Si je ne me trompe pas, qui précède implique que Marshal.FinalReleaseComObject et Marshal.ReleaseComObject faire la même chose dans la pratique.

Cependant, aujourd'hui, je en train d'écrire des tests pour vérifier que les objets COM sont correctement libérés par mon code. Je le fais en invoquant l'objet soi-disant libéré et la vérification de l'InvalidComObjectException prévu. Il se trouve qu'il ya des cas où l'exception est levée après une FinalReleaseComObject, mais pas après une ReleaseComObject.

Est-ce que cela signifie que le temps d'exécution .NET 2.0 peut contenir plus d'une référence à un objet COM? Si oui, quand il fait cela?

Était-ce utile?

La solution

Il y a un niveau supplémentaire d'indirection ici. Oui, le RCW conserve un compte de référence unique sur les pointeurs d'interface COM natif. Mais le RCW a un compte de référence aussi, il est incrémenté à chaque fois qu'un pointeur d'interface COM est mis en correspondance avec le BRF. Ce qui peut se produire si une méthode COM renvoie un pointeur d'interface. Le finaliseur de la classe wrapper .NET correspondant décrémente.

Vous pouvez bricoler avec cette référence compte directement par Marshal.ReleaseComObject (), qui décrémente par un comme l'finaliseur fait, et Marshal.FinalReleaseComObject (), qu'il zaps à zéro, ce qui garantit que le IUnknown :: Release () méthode est appelée. Ils tombent de cours dans le « mieux connaître ce que vous faites » catégorie. Se tromper produit le laid et undebuggable « objet COM séparé de son RCW sous-jacent » exception.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top