Creo que su confusión proviene de un malentendido de lo que realmente hace .maxstack
. Es un error fácil de hacer, porque parece que causaría un error al ejecutar. Sorprendentemente, esa directiva en particular tiene que nada tiene que ver con el tamaño de la pila en el tiempo de ejecución, sino que se usa específicamente durante la verificación del código.
de la partición III - Sección 1.7.4
Nota: Maxstack se relaciona con el análisis del programa, no al tamaño de la pila en tiempo de ejecución. No especifica el tamaño máximo en bytes de un marco de pila, sino más bien el número de elementos que una herramienta de análisis debe rastrear.
El código se convierte en no verificable. Esa misma sección, señala que cualquier implementación conforme no necesita admite un método con un valor máximo de pila no válido. Sin embargo, no dice que no debe, y bastante claro, el tiempo de ejecución está ejecutando el código. Entonces, si parece no tener ningún efecto, ¿por qué molestarse en tenerlo?
creas o no, de forma predeterminada , el marco .NET corre no verificable código. En realidad, fue difícil para mí averiguar cómo habilitar la verificación en .NET 4.0, pero si encienda CAS, su programa (con .maxstack 1
) dejará de funcionar con
Excepción no controlada: System.InvalidProgramException: Común Language Runtime detectó un programa no válido. al principal()
Teniendo esto en cuenta, no verificable el código no puede funcionar en cualquier entorno que no tiene plena confianza (generalmente asambleas de internet). Si eso no es importante para usted, puede dejar que sea un valor no válido, y realmente no hará la diferencia. Si el código mismo sigue siendo correcto, se ejecutará correctamente; por supuesto, si realmente hay un problema con la pila IL, lanzará un InvalidProgramException
.
esto es lo que primero pensé, pero el programa aún se ejecuta si establezco el .maxstack en el programa anterior en 1. Debe ser 2 o más para el programa de lo que puedo ver. – w0051977
Solo estoy adivinando aquí, pero tal vez ILASM es lo suficientemente inteligente como para darse cuenta de que 1 no sería suficiente y anula la configuración. –
@ 500-InternalServerError, no lo es. Según ILDASM, el código emitido realmente contiene '.maxstack 1'. Y de acuerdo con la especificación, dicho código debería ser inválido y no verificable. Y PEVerify en realidad falla la verificación del ensamblado. Pero funciona bien de todos modos. – svick