Freigeben über


invalidCERCall-MDA

Hinweis

Dieser Artikel gilt für das .NET Framework. Sie gilt nicht für neuere Implementierungen von .NET, einschließlich .NET 6 und höherer Versionen.

Der invalidCERCall-MDA (Assistent für verwaltetes Debuggen) wird aktiviert, wenn ein Aufruf innerhalb des Diagramms des eingeschränkten Ausführungsbereichs (CER) an eine Methode stattfindet, die keinen Zuverlässigkeitsvertrag oder einen übermäßig schwachen Vertrag besitzt. Ein schwacher Vertrag ist ein Vertrag, der deklariert, dass die schlimmste Zustandsbeschädigung einen größeren Umfang hat als die an den Aufruf übergebene Instanz. AppDomain oder der Prozessstatus werden also möglicherweise beschädigt oder das Ergebnis bei einem Aufruf innerhalb eines CER kann nicht immer deterministisch berechnet werden.

Symptome

Unerwartete Ergebnisse beim Ausführen von Code in einem CER. Die Symptome sind nicht spezifisch. Bei diesen handelt es sich möglicherweise um unerwartete OutOfMemoryException-, ThreadAbortException- oder andere Ausnahmen beim Aufruf der unzuverlässigen Methode, da die Common Language Runtime sie nicht rechtzeitig vorbereitet hat oder vor ThreadAbortException-Ausnahmen zur Laufzeit schützt. Eine stärkere Bedrohung ist die Tatsache, dass eine Ausnahme aus der Methode zur Laufzeit AppDomain oder Prozesse in einem instabilen Zustand hinterlassen könnte, was im Gegensatz zum Ziel eines CER steht. Ein CER wird erstellt, um Beschädigungen des Zustands wie diese zu vermeiden. Die Symptome des beschädigten Zustands sind anwendungsspezifisch, da die Definition des konsistenten Zustands sich zwischen den Anwendungen unterscheidet.

Ursache

Code in einem CER ruft eine Funktion ohne ReliabilityContractAttribute oder mit einem schwachen ReliabilityContractAttribute auf, die nicht für die Ausführung in einem CER kompatibel ist.

In Bezug auf die Syntax der Zuverlässigkeitsverträge ist ein schwacher Vertrag ein Vertrag, der keinen Consistency-Enumerationswert oder einen Consistency-Wert von MayCorruptProcess, MayCorruptAppDomain oder None angibt. Jede dieser Bedingungen gibt an, dass der aufgerufene Code die Anstrengungen des anderen Codes im CER beeinträchtigen kann, um einen konsistenten Zustand beizubehalten. Durch CERs kann Code Fehler sehr deterministisch behandeln. Interne Varianten, die für die Anwendung von Bedeutung sind, werden beibehalten, und bei vorübergehenden Fehlern wie Out-of-Memory-Ausnahmen wird die Anwendung weiterhin ausgeführt.

Die Aktivierung dieses MDAs gibt an, dass diese Methode, die im CER aufgerufen wurde, in einer Weise fehlschlagen kann, die der Aufrufer nicht erwartet hat oder die bewirkt, dass AppDomain oder der Prozesszustand beschädigt oder nicht wiederherstellbar sind. Natürlich kann der aufgerufene Code ordnungsgemäß ausgeführt werden, und das Problem ist ganz einfach nur ein fehlender Vertrag. Allerdings sind die Probleme beim Schreiben von zuverlässigem Code subtil, und das Fehlen eines Vertrags ist ein guter Indikator dafür, dass der Code möglicherweise nicht ordnungsgemäß ausgeführt wird. Die Verträge sind Indikatoren, die der Programmierer zuverlässig codiert hat, und diese Garantien werden zukünftige Versionen des Codes nicht ändern. Die Verträge sind also Absichtserklärungen und nicht nur Implementierungsdetails.

Da jede Methode mit einem schwachen oder nicht vorhandenen Vertrag auf unvorhersehbare Weise fehlschlagen kann, versucht die Common Language Runtime, nicht die eigenen unvorhersehbaren Fehler der Methode zu entfernen, die beispielsweise durch verzögerte JIT-Kompilierung, Generics-Wörterbuchauffüllung oder Threadabbrüche eingeführt werden. Wenn dieser MDA aktiviert wird, bedeutet dies also, dass die Runtime die aufgerufene Methode nicht in den definierten CER einschließt. Das Aufrufdiagramm wurde an diesem Knoten beendet, da die Vorbereitung dieser Teilstruktur potenzielle Fehler maskieren würde.

Lösung

Fügen Sie einen gültigen Zuverlässigkeitsvertrag zur Funktion hinzu, oder vermeiden Sie die Verwendung dieses Funktionsaufrufs.

Auswirkungen auf die Laufzeit

Der Aufruf eines schwachen Vertrags aus einem CER führt möglicherweise dazu, dass der CER seine Vorgänge nicht vollständig ausführen kann. Dies kann zu einer Beschädigung des AppDomain-Prozesszustands führen.

Output

Im Folgenden finden Sie eine Beispielausgabe dieses MDAs.

Method 'MethodWithCer', while executing within a constrained execution region, makes a call at IL offset 0x000C to 'MethodWithWeakContract', which does not have a sufficiently strong reliability contract and might cause non-deterministic results.

Konfiguration

<mdaConfig>
  <assistants>
    <invalidCERCall />
  </assistants>
</mdaConfig>

Siehe auch