Po usunięciu Ldstr "a"
i Call Console.WriteLine
(przed Ret
), kod działa poprawnie, w przeciwnym razie po wywołaniu zostanie zgłoszony kod InvalidProgramException
. Czy to oznacza, że wymagany jest pusty stos ewaluacyjny?Czy przed blokiem wyjątków wymagany jest pusty stos oceny?
class Program
{
delegate void Del();
static void Main(string[] args)
{
DynamicMethod dynamicMethod = new DynamicMethod("", null, Type.EmptyTypes);
ILGenerator ilGen = dynamicMethod.GetILGenerator();
ilGen.Emit(OpCodes.Ldstr, "a");
ilGen.BeginExceptionBlock();
ilGen.Emit(OpCodes.Ldstr, "b");
ilGen.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", BindingFlags.Static | BindingFlags.Public, null, new Type[] { typeof(string) }, null));
ilGen.BeginCatchBlock(typeof(Exception));
ilGen.EndExceptionBlock();
ilGen.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", BindingFlags.Static | BindingFlags.Public, null, new Type[] { typeof(string) }, null));
ilGen.Emit(OpCodes.Ret);
((Del)dynamicMethod.CreateDelegate(typeof(Del))).Invoke();
}
}
Podejrzewam, że tak jest (że stos oceny musi być pusty przed wprowadzeniem nowej ramki wyjątków), ale nie mogę teraz znaleźć oficjalnego odniesienia. –