Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Note
Cet article est spécifique à .NET Framework. Elle ne s’applique pas aux implémentations plus récentes de .NET, notamment .NET 6 et versions ultérieures.
L’Assistant virtualCERCall débogage managé (MDA) est activé en tant qu’avertissement indiquant qu’un site d’appel au sein d’un graphique d’appel de région d’exécution contrainte (CER) fait référence à une cible virtuelle, autrement dit, à un appel virtuel à une méthode virtuelle non finale ou à un appel à l’aide d’une interface. Le Common Language Runtime (CLR) ne peut pas prédire la méthode de destination de ces appels uniquement à partir du langage intermédiaire et de l’analyse des métadonnées. Par conséquent, l’arborescence des appels ne peut pas être préparée dans le cadre du graphique CER et des abandons de thread dans cette sous-arborescence ne peuvent pas être automatiquement bloquées. Cette MDA avertit les cas où un cer peut avoir besoin d’être étendu à l’aide d’appels explicites à la méthode une fois que les informations supplémentaires requises pour calculer la cible d’appel sont connues au moment de l’exécution PrepareMethod .
Symptômes
Les cers qui ne s’exécutent pas lorsqu’un thread est abandonné ou qu’un domaine d’application est déchargé.
La cause
Un cer contient un appel à une méthode virtuelle qui ne peut pas être préparée automatiquement.
Résolution
Appel de PrepareMethod la méthode virtuelle.
Effet sur le runtime
Ce MDA n’a aucun effet sur le CLR.
Output
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"
Paramétrage
<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();
}
}