Nota
O acceso a esta páxina require autorización. Pode tentar iniciar sesión ou modificar os directorios.
O acceso a esta páxina require autorización. Pode tentar modificar os directorios.
Nota:
Este artículo es específico de .NET Framework. No se aplica a implementaciones más recientes de .NET, incluidas .NET 6 y versiones posteriores.
El invalidCERCall asistente de depuración administrada (MDA) se activa cuando hay una llamada dentro del gráfico de la región de ejecución restringida (CER) a un método que no tiene ningún contrato de confiabilidad o un contrato excesivamente débil. Un contrato débil es un contrato que declara que el peor caso de daños en el estado es mayor que la instancia pasada a la llamada, es decir, el estado del AppDomain proceso o puede estar dañado o que su resultado no siempre es deterministamente computable cuando se llama dentro de una CER.
Síntomas
Resultados inesperados al ejecutar código en un CER. Los síntomas no son específicos. Podrían ser una excepción inesperada OutOfMemoryException, una ThreadAbortExceptionu otras excepciones en la llamada al método no confiable porque el tiempo de ejecución no lo preparó con antelación o lo protegió de ThreadAbortException las excepciones en tiempo de ejecución. Una mayor amenaza es que cualquier excepción resultante del método en tiempo de ejecución podría dejar el AppDomain proceso o en un estado inestable, lo que es contrario al objetivo de una CER. El motivo por el que se crea un CER es evitar daños en el estado, como este. Los síntomas del estado dañado son específicos de la aplicación porque la definición del estado coherente es diferente entre las aplicaciones.
Causa
El código dentro de una CER llama a una función sin ReliabilityContractAttribute o con un débil ReliabilityContractAttribute que no es compatible con la ejecución en un CER.
En términos de sintaxis de contrato de confiabilidad, un contrato débil es un contrato que no especifica un Consistency valor de enumeración o especifica un Consistency valor de MayCorruptProcess, MayCorruptAppDomaino None. Cualquiera de estas condiciones indica que el código llamado puede impedir los esfuerzos del otro código del CER para mantener un estado coherente. Los CER permiten que el código trate los errores de forma muy determinista, manteniendo las invariables internas que son importantes para la aplicación y lo que le permite seguir ejecutándose frente a errores transitorios, como excepciones fuera de memoria.
La activación de este MDA indica una posibilidad de que se llame al método en el CER puede producir un error de manera que el autor de la llamada no esperaba o que deja AppDomain el estado de proceso dañado o irrecuperable. Por supuesto, el código llamado podría ejecutarse correctamente y el problema es simplemente un contrato que falta. Sin embargo, los problemas relacionados con la escritura de código confiable son sutiles y la ausencia de un contrato es un buen indicador que es posible que el código no se ejecute correctamente. Los contratos son indicadores que el programador ha codificado de forma confiable y también promete que estas garantías no cambiarán en futuras revisiones del código. Es decir, los contratos son declaraciones de intención y no solo detalles de implementación.
Dado que cualquier método con un contrato débil o inexistente puede producir errores de muchas maneras impredecibles, el tiempo de ejecución no intenta quitar ninguno de sus propios errores imprevisibles del método introducido por la compilación diferida de JIT, el rellenado de diccionarios genéricos o anulaciones de subprocesos, por ejemplo. Es decir, cuando se activa este MDA, indica que el tiempo de ejecución no incluyó el método llamado en el CER que se está definiendo; El gráfico de llamadas se finalizó en este nodo porque continuar con la preparación de este subárbol ayudaría a enmascarar el posible error.
Resolución
Agregue un contrato de confiabilidad válido a la función o evite usar esa llamada de función.
Efecto en el tiempo de ejecución
El efecto de llamar a un contrato débil desde un CER podría ser el error de CER para completar sus operaciones. Esto podría provocar daños en el estado del AppDomain proceso.
Salida
A continuación se muestra la salida de ejemplo de este 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.
Configuración
<mdaConfig>
<assistants>
<invalidCERCall />
</assistants>
</mdaConfig>