virtualCERCall MDA
Notitie
Dit artikel is specifiek voor .NET Framework. Dit geldt niet voor nieuwere implementaties van .NET, waaronder .NET 6 en nieuwere versies.
De virtualCERCall
beheerde foutopsporingsassistent (MDA) wordt geactiveerd als een waarschuwing die aangeeft dat een aanroepsite in een cer-aanroepgrafiek (constrained execution region) verwijst naar een virtueel doel, dat wil zeggen een virtuele aanroep naar een niet-definitieve virtuele methode of een aanroep met behulp van een interface. De Common Language Runtime (CLR) kan de doelmethode van deze aanroepen niet alleen voorspellen vanuit de tussenliggende taal en metagegevensanalyse. Als gevolg hiervan kan de aanroepstructuur niet worden voorbereid als onderdeel van de CER-grafiek en thread die in die substructuur wordt afgebroken, niet automatisch worden geblokkeerd. Deze MDA waarschuwt voor gevallen waarin een CER mogelijk moet worden uitgebreid met behulp van expliciete aanroepen naar de PrepareMethod methode zodra de aanvullende informatie die nodig is om het aanroepdoel te berekenen, bekend is tijdens runtime.
Symptomen
CERs die niet worden uitgevoerd wanneer een thread wordt afgebroken of een toepassingsdomein wordt verwijderd.
Oorzaak
Een CER bevat een aanroep naar een virtuele methode die niet automatisch kan worden voorbereid.
Oplossing
Roep PrepareMethod de virtuele methode aan.
Effect op de runtime
Deze MDA heeft geen effect op de CLR.
Uitvoer
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"
Configuratie
<mdaConfig>
<assistants>
<VirtualCERCall />
</assistants>
</mdaConfig>
Voorbeeld
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();
}
}