我正在通过ilgenerator生成一个方法,我遇到了问题。 IlGenerator.BeginCatchBlock()
部队离开,在这种情况下是无法接通的指令。
using System;
using System.Reflection;
using System.Reflection.Emit;
using System.Threading;
namespace Stack
{
class Program
{
static void Main(string[] args)
{
var asmName = new AssemblyName("Test");
var domain = Thread.GetDomain();
var assembly = domain.DefineDynamicAssembly(asmName, AssemblyBuilderAccess.RunAndSave);
var module = assembly.DefineDynamicModule("MyModule", "Test.dll", true);
var type = module.DefineType("MyType");
var method = type.DefineMethod("MyMethod", MethodAttributes.Public);
var ilg = method.GetILGenerator();
ilg.BeginExceptionBlock();
ilg.ThrowException(typeof(Exception));
ilg.BeginCatchBlock(typeof(Exception));
ilg.Emit(OpCodes.Pop);
ilg.EndExceptionBlock();
ilg.Emit(OpCodes.Ret);
type.CreateType();
assembly.Save("test.dll");
}
}
}
实际上,输出就像
.method public instance void MyMethod () cil managed
{
.maxstack 1
.try
{
IL_0000: newobj instance void [mscorlib]System.Exception::.ctor()
IL_0005: throw
IL_0006: leave IL_0011
} // end .try
catch [mscorlib]System.Exception
{
IL_000b: pop
IL_000c: leave IL_0011
} // end handler
IL_0011: ret
}
我预计不会将IL_0011留在.try块。 PEVerify没有显示错误。