Wenn ich Ldstr "a"
und Call Console.WriteLine
(vor Ret
) entferne, läuft der Code gut, andernfalls wird beim Aufruf ein InvalidProgramException
ausgelöst. Bedeutet dies, dass ein leerer Auswertungsstapel benötigt wird?Ist vor einem Ausnahmeblock ein leerer Auswertungsstapel erforderlich?
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();
}
}
finden könnten Ich vermute, dass dies der Fall ist (dass der Auswertungsstapel leer sein muss, bevor ein neues Ausnahmerahmen eingeführt wird), aber ich kann eine offizielle Referenz jetzt nicht finden. –