Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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 virtualCERCall MDA (assistente de depuração gerenciada) é ativado como um aviso indicando que um site de chamada dentro de um grafo de chamada CER (região de execução restrita) refere-se a um destino virtual, ou seja, uma chamada virtual para um método virtual não final ou uma chamada usando uma interface. O CLR (Common Language Runtime) não pode prever o método de destino dessas chamadas apenas da linguagem intermediária e da análise de metadados. Como resultado, a árvore de chamadas não pode ser preparada como parte do grafo CER e as anulações de thread nessa subárvore não podem ser bloqueadas automaticamente. Esse MDA alerta para casos em que uma CER pode precisar ser estendida usando chamadas explícitas para o PrepareMethod método depois que as informações adicionais necessárias para calcular o destino de chamada forem conhecidas em runtime.
Sintomas
CERs que não são executados quando um thread é anulado ou um domínio de aplicativo é descarregado.
Motivo
Uma CER contém uma chamada para um método virtual que não pode ser preparado automaticamente.
Resolução
Chame PrepareMethod o método virtual.
Efeito no Runtime
Esse MDA não tem nenhum efeito sobre o CLR.
Saída
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();
}
}