2

我正在通过 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 没有显示错误。

4

0 回答 0