下記プログラムはなぜか動作しません。その理由が知りたくて書き込みました。gen.MarkLabelの位置が悪いのかOpCodes.Call後に移動させると"動いた!"という文字が表示されます。または、Opcodes.Ldc_I4からOpCodes.Brtureまでをコメントにすると動きます。
public delegate void ScriptRunner();
static void Main(string[] args)
{
DynamicMethod dm = new DynamicMethod(
"", null, null, typeof(StartupClass).Module);
ILGenerator gen = dm.GetILGenerator();
Label ET1 = gen.DefineLabel();
////////////////////////////////////////////////////////
gen.Emit(OpCodes.Ldc_I4, 0);
gen.Emit(OpCodes.Ldc_I4, 1);
gen.Emit(OpCodes.Ceq );// 0!=1なので0がpush
gen.Emit(OpCodes.Brtrue, ET1); // falseなので、ET1へは飛ばない
gen.Emit(OpCodes.Ldstr, "動いた!");
gen.MarkLabel(ET1); // これをコメントして下に移動させると動く
MethodInfo mi = typeof(Console).GetMethod("Write", new Type[]{ typeof(string)});
gen.Emit(OpCodes.Call, mi);
//gen.MarkLabel(ET1);
gen.Emit(OpCodes.Ret);
/////////////////////////////////////////////////////////
ScriptRunner run = (ScriptRunner)dm.CreateDelegate(typeof(ScriptRunner));
run();
}