Compartir a través de


CORPROF_E_UNSUPPORTED_CALL_SEQUENCE (HRESULT)

El CORPROF_E_UNSUPPORTED_CALL_SEQUENCE HRESULT se introdujo en .NET Framework versión 2.0. .NET Framework 4 devuelve este HRESULT en dos escenarios:

  • Cuando un generador de perfiles de secuestro restablece forzosamente el contexto de registro de un subproceso en un momento arbitrario para que el subproceso intente acceder a las estructuras que están en un estado incoherente.

  • Cuando un generador de perfiles intenta llamar a un método informativo que desencadena la recolección de elementos no utilizados desde un método de devolución de llamada que prohíbe la recolección de elementos no utilizados.

Estos dos escenarios se describen en las secciones siguientes.

Secuestradores de perfiles

(Este escenario es principalmente un problema con los generadores de perfiles de secuestro, aunque hay casos en los que los generadores de perfiles no secuestradores pueden ver este HRESULT).

En este escenario, un generador de perfiles secuestrador restablece forzosamente el contexto de registro de un subproceso en un momento arbitrario para que el subproceso pueda escribir código del generador de perfiles o volver a escribir Common Language Runtime (CLR) a través de un método ICorProfilerInfo.

Muchos de los identificadores que proporciona la API de generación de perfiles apuntan a estructuras de datos en CLR. Muchas llamadas ICorProfilerInfo simplemente leen información de estas estructuras de datos y las devuelven. Sin embargo, CLR podría cambiar las cosas de esas estructuras a medida que se ejecuta y podría usar bloqueos para hacerlo. Supongamos que CLR ya estaba manteniendo (o intentando adquirir) un bloqueo en el momento en que el generador de perfiles secuestró el subproceso. Si el subproceso vuelve a escribir CLR e intenta tomar más bloqueos o inspeccionar estructuras que estaban en proceso de modificación, estas estructuras podrían estar en un estado incoherente. Los interbloqueos y las infracciones de acceso pueden producirse fácilmente en tales situaciones.

En general, cuando un generador de perfiles sin secuestro ejecuta código dentro de un método ICorProfilerCallback y llama a un método ICorProfilerInfo con parámetros válidos, no debe interbloquear ni recibir una infracción de acceso. Por ejemplo, el código del generador de perfiles que se ejecuta dentro del método ICorProfilerCallback::ClassLoadFinished puede pedir información sobre la clase llamando al método ICorProfilerInfo2::GetClassIDInfo2. El código puede recibir un CORPROF_E_DATAINCOMPLETE HRESULT para indicar que la información no está disponible. Sin embargo, no se interbloqueará ni recibirá una infracción de acceso. Estas llamadas a ICorProfilerInfo se consideran sincrónicas, ya que se realizan a partir de un método ICorProfilerCallback.

Sin embargo, un hilo gestionado que ejecuta código que no está dentro de un método ICorProfilerCallback que se considera que está haciendo una llamada asíncrona. En .NET Framework versión 1, era difícil determinar lo que podría ocurrir en una llamada asincrónica. La llamada podría interbloqueo, bloqueo o dar una respuesta no válida. .NET Framework versión 2.0 introdujo algunas comprobaciones sencillas para ayudarle a evitar este problema. En .NET Framework 2.0, si llama a una función no segura ICorProfilerInfo de forma asincrónica, se produce un error con un CORPROF_E_UNSUPPORTED_CALL_SEQUENCE HRESULT.

En general, las llamadas asincrónicas no son seguras. Sin embargo, los métodos siguientes son seguros y admiten específicamente llamadas asincrónicas:

Para obtener más información, consulte la entrada Por qué tenemos CORPROF_E_UNSUPPORTED_CALL_SEQUENCE en el blog de LA API de generación de perfiles de CLR.

Desencadenar recolecciones de elementos no utilizados

Este escenario implica un generador de perfiles que se ejecuta dentro de un método de devolución de llamada (por ejemplo, uno de los métodos ICorProfilerCallback) que prohíbe la recolección de elementos no utilizados. Si el generador de perfiles intenta llamar a un método informativo (por ejemplo, un método en la interfaz ICorProfilerInfo) que podría desencadenar una recolección de elementos no utilizados, se produce un error en el método informativo con un CORPROF_E_UNSUPPORTED_CALL_SEQUENCE HRESULT.

En la tabla siguiente se muestran los métodos de devolución de llamada que prohíben las recolecciones de elementos no utilizados y los métodos informativos que pueden desencadenar recolecciones de elementos no utilizados. Si el generador de perfiles se ejecuta dentro de uno de los métodos de devolución de llamada enumerados y llama a uno de los métodos informativos enumerados, se produce un error en ese método informativo con un CORPROF_E_UNSUPPORTED_CALL_SEQUENCE HRESULT.

Métodos de devolución de llamada que prohíben la recolección de elementos no utilizados Métodos informativos que desencadenan recolecciones de elementos no utilizados
ThreadAssignedToOSThread

ExceptionUnwindFunctionEnter

ExceptionUnwindFunctionLeave

ExceptionUnwindFinallyEnter

ExceptionUnwindFinallyLeave

ExceptionCatcherEnter

RuntimeSuspendStarted

RuntimeSuspendFinished

RuntimeSuspendAborted

RuntimeThreadSuspended

RuntimeThreadResumed

MovedReferences

ObjectReferences

ObjectsAllocatedByClass

RootReferences2

HandleCreated

HandleDestroyed

GarbageCollectionStarted

GarbageCollectionFinished
GetILFunctionBodyAllocator

SetILFunctionBody

SetILInstrumentedCodeMap

ForceGC

GetClassFromToken

GetClassFromTokenAndTypeArgs

GetFunctionFromTokenAndTypeArgs

GetAppDomainInfo

EnumModules

RequestProfilerDetach

GetAppDomainsContainingModule

Consulte también