Share via


Marshal.ReleaseComObject(Object) Método

Definición

Disminuye el recuento de referencias del contenedor RWC asociado al objeto COM especificado.

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

Parámetros

o
Object

Objeto COM que se va a liberar.

Devoluciones

Nuevo valor del recuento de referencias del contenedor RCW asociado a o. Este valor suele ser cero ya que el RCW conserva una sola referencia al objeto COM incluido en el contenedor, independientemente del número de clientes administrados que lo llamen.

Atributos

Excepciones

o no es un objeto COM válido.

Comentarios

Este método se usa para controlar explícitamente la duración de un objeto COM utilizado desde código administrado. Debe usar este método para liberar el objeto COM subyacente que contiene referencias a recursos de forma oportuna o cuando los objetos deben liberarse en un orden específico.

Cada vez que un puntero de interfaz COM entra en Common Language Runtime (CLR), se encapsula en un RCW.

El RCW tiene un recuento de referencias que se incrementa cada vez que se asigna un puntero de interfaz COM. El ReleaseComObject método disminuye el recuento de referencias de un RCW. Cuando el recuento de referencias alcanza cero, el tiempo de ejecución libera todas sus referencias en el objeto COM no administrado y produce un System.NullReferenceException si intenta usar el objeto aún más. Si se pasa la misma interfaz COM más de una vez del código no administrado al código administrado, el recuento de referencias del contenedor se incrementa cada vez y la llamada a ReleaseComObject devuelve el número de referencias restantes.

Este método le permite forzar una versión de recuento de referencias de RCW para que se produzca precisamente cuando lo desee. Sin embargo, el uso incorrecto de ReleaseComObject puede provocar un error en la aplicación o puede provocar una infracción de acceso.

Considere un escenario en el que el código administrado de un dominio de aplicación se mantiene en un RCW que representa un componente COM. Si llama al ReleaseComObject método en rcW, el código administrado no podrá acceder al RCW y generará una InvalidComObjectException excepción.

Puede producirse un error más grave si se ejecuta una llamada a RCW cuando se libera el RCW. En este caso, hay una buena probabilidad de que el subproceso que realiza la llamada provoque una infracción de acceso. Sin embargo, la memoria del proceso puede dañarse y el proceso puede seguir ejecutándose hasta que se produzca un error por motivos muy difíciles de depurar.

Este riesgo se compone cuando el componente COM que se usa es un singleton, por la siguiente razón: CLR activa los componentes COM llamando a la función COM CoCreateInstance , que devuelve el mismo puntero de interfaz cada vez que se llama a para los componentes COM singleton. Por lo tanto, partes independientes e independientes del código administrado en un dominio de aplicación pueden usar el mismo RCW para un componente COM singleton y, si alguna llama al ReleaseComObject método en el componente COM, se romperá la otra.

Por lo tanto, use el ReleaseComObject único si es absolutamente necesario. Si desea llamar a este método para asegurarse de que se libera un componente COM en un momento determinado, considere la posibilidad de usar el FinalReleaseComObject método en su lugar. FinalReleaseComObject liberará el componente COM subyacente independientemente de cuántas veces haya vuelto a escribir clR. El recuento de referencias internas del RCW se incrementa en uno cada vez que el componente COM vuelve a entrar en clR. Por lo tanto, podría llamar al ReleaseComObject método en un bucle hasta que el valor devuelto sea cero. Esto logra el mismo resultado que el FinalReleaseComObject método .

Se aplica a

Consulte también