Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Observação
Este artigo é específico do .NET Framework. Ele não se aplica a implementações mais recentes do .NET, incluindo o .NET 6 e versões posteriores.
O assistente virtualCERCall de depuração gerido (MDA) é ativado como um aviso indicando que um local de chamada dentro de um grafo de chamada de região de execução restrita (CER) se refere a um alvo virtual, ou seja, uma chamada virtual para um método virtual não final ou uma chamada usando uma interface. O tempo de execução da linguagem comum (CLR) não pode prever o método de destino destas chamadas apenas a partir da linguagem intermédia e da análise de metadados. Como resultado, a árvore de chamadas não pode ser preparada como parte do grafo CER e o thread aborta nessa subárvore que não pode ser automaticamente bloqueado. Este MDA alerta para casos em que um CER possa precisar de ser estendido usando chamadas explícitas ao PrepareMethod método, uma vez que a informação adicional necessária para calcular o destino da chamada seja conhecida em tempo de execução.
Sintomas
CERs que não executam quando um thread é abortado ou quando um domínio de aplicação é descarregado.
Motivo
Uma CER contém uma chamada para um método virtual que não pode ser preparada automaticamente.
Resolução
Peça PrepareMethod pelo método virtual.
Efeito no tempo de execução
Este MDA não tem efeito no CLR.
Resultado
Method 'MethodWithCer', while executing within a constrained execution region, makes a call
at IL offset 0x0024 to 'VirtualMethod', which is virtual and cannot be prepared automatically
at compile time. The caller must ensure this method is prepared explicitly at
runtime before entering the constrained execution region.
method name="VirtualMethod"
declaringType name="VirtualCERCall+MyClass"
declaringModule name="mda"
callsite name="MethodWithCer" offset="0x0024"
Configuração
<mdaConfig>
<assistants>
<VirtualCERCall />
</assistants>
</mdaConfig>
Example
class MyClass
{
[ReliabilityContract(Consistency.MayCorruptProcess, CER.None)]
virtual void VirtualMethod()
{
...
}
}
class MyDerivedClass : MyClass
{
[ReliabilityContract(Consistency.MayCorruptProcess, CER.None)]
override void VirtualMethod()
{
...
}
}
void MethodWithCer(MyClass object)
{
RuntimeHelpers.PrepareConstrainedRegions();
try
{
...
}
finally
{
// Start of the CER.
// Cannot tell at analysis time whether object is a MyClass
// or a MyDerivedClass, so we do not know which version of
// VirtualMethod we are going to call.
object.VirtualMethod();
}
}