Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Замечание
Эта статья связана с .NET Framework. Он не применяется к более новым реализациям .NET, включая .NET 6 и более поздние версии.
Помощник invalidCERCall по управляемой отладке активируется при наличии вызова в графе ограниченного выполнения (CER) метода, не имеющего контракта надежности или чрезмерно слабого контракта. Слабый контракт является контрактом, который объявляет, что худшее повреждение состояния дела имеет большую область, чем экземпляр, переданный вызову, то есть AppDomain состояние процесса может стать поврежденным или что его результат не всегда детерминирован, при вызове в CER.
Симптомы
Непредвиденные результаты при выполнении кода в CER. Симптомы не являются конкретными. Они могут быть непредвиденными OutOfMemoryException, а ThreadAbortExceptionтакже другими исключениями при вызове ненадежного метода, так как среда выполнения не подготавливала его заранее или не защищала его от ThreadAbortException исключений во время выполнения. Большая угроза заключается в том, что любое исключение, полученное из метода во время выполнения, может оставить AppDomain или обработать в нестабильном состоянии, что противоречит цели CER. Причина создания CER заключается в том, чтобы избежать повреждений состояния, таких как это. Симптомы поврежденного состояния зависят от приложения, так как определение согласованного состояния отличается от приложений.
Причина
Код в CER вызывает функцию без ReliabilityContractAttribute или с слабым ReliabilityContractAttribute , несовместимым с выполнением в CER.
С точки зрения синтаксиса контракта надежности слабый контракт — это контракт, который не указывает Consistency значение перечисления или задает Consistency значение MayCorruptProcess, MayCorruptAppDomainили None. Любое из этих условий указывает, что вызываемое кодом может препятствовать усилиям другого кода в CER для поддержания согласованного состояния. ЦС позволяют коду обрабатывать ошибки очень детерминированным образом, сохраняя внутренние инварианты, важные для приложения и позволяя ему продолжать работать в условиях временных ошибок, таких как исключения вне памяти.
Активация этого MDA указывает, что метод, вызываемый в CER, может завершиться сбоем таким образом, что вызывающий объект не ожидал или покидает AppDomain поврежденное или неуправляемое состояние процесса. Конечно, вызываемой код может выполняться правильно, и проблема просто отсутствует контракт. Однако проблемы, связанные с написанием надежного кода, являются тонкими, и отсутствие контракта является хорошим показателем, что код может не выполняться правильно. Контракты являются индикаторами того, что программист закодировал надежно, а также обещает, что эти гарантии не изменятся в будущих редакциях кода. То есть контракты являются объявлениями намерения и не только подробностями реализации.
Так как любой метод с слабым или несуществующим контрактом может привести к сбою во многих непредсказуемых способах, среда выполнения не пытается удалить какие-либо из своих собственных непредсказуемых сбоев из метода, представленных отложенным JIT-компиляцией, популяцией словарей универсальных шаблонов или прерываниями потока, например. То есть, когда этот MDA активируется, он указывает, что среда выполнения не включала вызываемый метод в определяемый CER; Граф вызовов был завершен на этом узле, так как продолжение подготовки этого поддерева поможет маскировать потенциальную ошибку.
Резолюция
Добавьте допустимый контракт надежности в функцию или избегайте использования этого вызова функции.
Влияние на среду выполнения
Эффект вызова слабого контракта из CER может быть сбоем CER для завершения своих операций. Это может привести к повреждению AppDomain состояния процесса.
Выходные данные
Ниже приведен пример выходных данных из этого MDA.
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.
Конфигурация
<mdaConfig>
<assistants>
<invalidCERCall />
</assistants>
</mdaConfig>