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

Int32

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 usado 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 una 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 genera 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 ReleaseComObject devuelve el número de referencias restantes.

Este método le permite forzar una versión del recuento de referencias de RCW para que se produzca exactamente 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 contiene un RCW que representa un componente COM. Si llama al ReleaseComObject método en el 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 al RCW cuando se libera el RCW. En este caso, existe una buena posibilidad 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 continuar 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 el siguiente motivo: CLR activa los componentes COM llamando a la función COM CoCreateInstance , que devuelve el mismo puntero de interfaz cada vez que se llama para 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 uno llama al ReleaseComObject método en el componente COM, se romperá el otro.

Por lo tanto, use el ReleaseComObject único si es absolutamente necesario. Si desea llamar a este método para asegurarse de que un componente COM se libere 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