Marshal.ReleaseComObject(Object) Méthode

Définition

Décrémente le décompte de références du wrapper RCW (Runtime Callable Wrapper) associé à l’objet COM indiqué.

public:
 static int ReleaseComObject(System::Object ^ o);
[System.Security.SecurityCritical]
public static int ReleaseComObject (object o);
[System.Runtime.Versioning.SupportedOSPlatform("windows")]
public static int ReleaseComObject (object o);
public static int ReleaseComObject (object o);
[<System.Security.SecurityCritical>]
static member ReleaseComObject : obj -> int
[<System.Runtime.Versioning.SupportedOSPlatform("windows")>]
static member ReleaseComObject : obj -> int
static member ReleaseComObject : obj -> int
Public Shared Function ReleaseComObject (o As Object) As Integer

Paramètres

o
Object

Objet COM à libérer.

Retours

Int32

Nouvelle valeur du décompte de références du wrapper RCW (Runtime Callable Wrapper) associé à o. Cette valeur est généralement zéro puisque le wrapper RCW (Runtime Callable Wrapper) ne conserve qu'une seule référence à l'objet COM inclus dans un wrapper indépendamment du nombre de clients managés qui l'appellent.

Attributs

Exceptions

o n'est pas un objet COM valide.

Remarques

Cette méthode est utilisée pour contrôler explicitement la durée de vie d’un objet COM utilisé à partir du code managé. Vous devez utiliser cette méthode pour libérer l’objet COM sous-jacent qui contient des références aux ressources en temps voulu ou lorsque les objets doivent être libérés dans un ordre spécifique.

Chaque fois qu’un pointeur d’interface COM entre dans le common language runtime (CLR), il est encapsulé dans un wrapper RCW.

Le wrapper RCW a un nombre de références qui est incrémenté chaque fois qu’un pointeur d’interface COM est mappé à celui-ci. La ReleaseComObject méthode décrémente le décompte de références d’un wrapper RCW. Lorsque le décompte de références atteint zéro, le runtime libère toutes ses références sur l’objet COM non managé et lève une System.NullReferenceException si vous tentez d’utiliser l’objet plus loin. Si la même interface COM est passée plus d’une fois du code non managé au code managé, le décompte de références sur le wrapper est incrémenté à chaque fois, et l’appel à ReleaseComObject retourne le nombre de références restantes.

Cette méthode vous permet de forcer la mise en service d’un nombre de références RCW de manière à ce qu’elle se produise précisément quand vous le souhaitez. Toutefois, l’utilisation incorrecte de ReleaseComObject peut entraîner l’échec de votre application ou entraîner une violation d’accès.

Imaginez un scénario dans lequel le code managé dans un domaine d’application est stocké sur un wrapper RCW qui représente un composant COM. Si vous appelez la ReleaseComObject méthode sur le wrapper RCW, le code managé ne pourra pas accéder au wrapper RCW et lèvera une InvalidComObjectException exception.

Une erreur plus sérieuse peut se produire si un appel au wrapper RCW est en cours d’exécution lorsque le wrapper RCW est relâché. Dans ce cas, il y a de bonnes chances que le thread effectuant l’appel provoque une violation d’accès. Toutefois, la mémoire de processus peut être endommagée et le processus peut continuer à s’exécuter jusqu’à ce qu’elle échoue pour des raisons très difficiles à déboguer.

Ce risque est composé lorsque le composant COM utilisé est un singleton, pour la raison suivante : le CLR active les composants COM en appelant la fonction COM CoCreateInstance , qui retourne le même pointeur d’interface chaque fois qu’elle est appelée pour les composants COM singleton. Ainsi, les éléments distincts et indépendants du code managé dans un domaine d’application peuvent utiliser le même wrapper RCW pour un composant COM singleton, et si l’un d’eux appelle la ReleaseComObject méthode sur le composant com, l’autre est rompu.

Par conséquent, utilisez ReleaseComObject uniquement s’il est absolument requis. Si vous souhaitez appeler cette méthode pour vous assurer qu’un composant COM est publié à un moment déterminé, envisagez d’utiliser la méthode à la FinalReleaseComObject place. FinalReleaseComObject libère le composant COM sous-jacent quel que soit le nombre de fois où il a entré de nouveau le CLR. Le décompte de références internes du wrapper RCW est incrémenté d’une unité chaque fois que le composant COM accède à nouveau au CLR. Par conséquent, vous pouvez appeler la ReleaseComObject méthode dans une boucle jusqu’à ce que la valeur retournée soit égale à zéro. Cela permet d’obtenir le même résultat que la FinalReleaseComObject méthode.

S’applique à

Voir aussi