CORPROF_E_UNSUPPORTED_CALL_SEQUENCE HRESULT
A CORPROF_E_UNSUPPORTED_CALL_SEQUENCE HRESULT foi introduzida no .NET Framework versão 2.0. .NET Framework 4 devolve este HRESULT em dois cenários:
Quando um gerador de perfis de sequestro repõe à força o contexto de registo de um thread num momento arbitrário para que o thread tente aceder a estruturas que estão num estado inconsistente.
Quando um gerador de perfis tenta chamar um método informativo que aciona a libertação da memória a partir de um método de chamada de retorno que proíbe a libertação da memória.
Estes dois cenários são abordados nas secções seguintes.
Hijacking Profilers
(Este cenário é principalmente um problema com a hijacking profilers, embora existam casos em que os geradores de perfis não hijacking podem ver este HRESULT.)
Neste cenário, um gerador de perfis de hijacking repõe à força o contexto de registo de um thread num momento arbitrário para que o thread possa introduzir o código do gerador de perfis ou reintroduzir o runtime de linguagem comum (CLR) através de um método ICorProfilerInfo .
Muitos dos IDs que a API de criação de perfis fornece apontam para estruturas de dados no CLR. Muitas ICorProfilerInfo
chamadas apenas leem informações destas estruturas de dados e transmitem-nas de volta. No entanto, o CLR pode alterar as coisas nessas estruturas à medida que é executada e pode utilizar bloqueios para o fazer. Suponha que o CLR já tinha (ou estava a tentar adquirir) um bloqueio no momento em que o gerador de perfis sequestrou o thread. Se o thread reentra no CLR e tentar obter mais bloqueios ou inspecionar estruturas que estavam em processo de modificação, estas estruturas poderão estar num estado inconsistente. Os impasses e as violações de acesso podem ocorrer facilmente nestas situações.
Em geral, quando um gerador de perfis não hijacking executa código dentro de um método ICorProfilerCallback e chama para um ICorProfilerInfo
método com parâmetros válidos, não deve bloquear ou receber uma violação de acesso. Por exemplo, o código do gerador de perfis que é executado no método ICorProfilerCallback::ClassLoadFinished pode pedir informações sobre a classe ao chamar o método ICorProfilerInfo2::GetClassIDInfo2 . O código pode receber um CORPROF_E_DATAINCOMPLETE HRESULT para indicar que as informações não estão disponíveis. No entanto, não irá bloquear ou receber uma violação de acesso. Estas chamadas ICorProfilerInfo
são consideradas síncronas, uma vez que são feitas a partir de um ICorProfilerCallback
método.
No entanto, considera-se que um thread gerido que executa código que não está dentro de um ICorProfilerCallback
método está a fazer uma chamada assíncrona. No .NET Framework versão 1, era difícil determinar o que poderia acontecer numa chamada assíncrona. A chamada pode bloquear, falhar ou dar uma resposta inválida. .NET Framework versão 2.0 introduziu algumas verificações simples para o ajudar a evitar este problema. No .NET Framework 2.0, se chamar uma função não segura ICorProfilerInfo
de forma assíncrona, esta falha com um CORPROF_E_UNSUPPORTED_CALL_SEQUENCE HRESULT.
Em geral, as chamadas assíncronas não são seguras. No entanto, os seguintes métodos são seguros e suportam especificamente chamadas assíncronas:
Para obter mais informações, veja a entrada Por que temos CORPROF_E_UNSUPPORTED_CALL_SEQUENCE no blogue da API de Criação de Perfis do CLR.
Acionar Libertações da Memória
Este cenário envolve um gerador de perfis que está a ser executado dentro de um método de chamada de retorno (por exemplo, um dos métodos) que proíbe a ICorProfilerCallback
libertação da memória. Se o gerador de perfis tentar chamar um método informativo (por exemplo, um método na interface) que possa acionar ICorProfilerInfo
uma libertação da memória, o método informativo falha com um CORPROF_E_UNSUPPORTED_CALL_SEQUENCE HRESULT.
A tabela seguinte apresenta os métodos de chamada de retorno que proíbem as libertações da memória e os métodos informativos que podem acionar libertações da memória. Se o gerador de perfis executar dentro de um dos métodos de chamada de retorno listados e chamar um dos métodos informativos listados, esse método informativo falhará com um CORPROF_E_UNSUPPORTED_CALL_SEQUENCE HRESULT.