Share via


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

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.

o a la valeur null.

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 les références aux ressources en temps opportun 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 RCW.

Le RCW a un nombre de références incrémenté chaque fois qu’un pointeur d’interface COM y est mappé. La ReleaseComObject méthode décrémente le nombre de références d’un RCW. Lorsque le nombre 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 un si vous tentez d’utiliser System.NullReferenceException davantage l’objet. Si la même interface COM est passée plusieurs fois du code non managé au code managé, le nombre de références sur le wrapper est incrémenté à chaque fois et l’appel ReleaseComObject renvoie le nombre de références restantes.

Cette méthode vous permet de forcer une version de nombre de références RCW afin qu’elle se produise exactement quand vous le souhaitez. Toutefois, une utilisation incorrecte de peut entraîner l’échec de ReleaseComObject votre application ou une violation d’accès.

Envisagez un scénario dans lequel le code managé d’un domaine d’application se maintient sur une instance RCW qui représente un composant COM. Si vous appelez la ReleaseComObject méthode sur le RCW, le code managé ne pourra pas accéder au RCW et déclenchera une InvalidComObjectException exception.

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

Ce risque est aggravé 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’il est appelé pour les composants COM singleton. Ainsi, des éléments distincts et indépendants de code managé dans un domaine d’application peuvent utiliser le même RCW pour un composant COM singleton, et si l’un d’eux appelle la ReleaseComObject méthode sur le composant COM, l’autre sera rompu.

Par conséquent, utilisez le ReleaseComObject uniquement s’il est absolument nécessaire. Si vous souhaitez appeler cette méthode pour vous assurer qu’un composant COM est libéré à 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 réinscrit le CLR. Le nombre de références internes du RCW est incrémenté d’une fois chaque fois que le composant COM entre à nouveau dans le 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