2016-04-22 4 views
1

Я испустил некоторый IL-код, который вызывает код пользователя. Я завершаю вызов моего кода IL (из кода пользователя) в блоке try/catch, чтобы поймать любые Исключения, которые происходят внутри него. Внутренний код пользователя генерирует исключение, которое правильно попадает в блок try/catch внешнего пользовательского кода. Это все, что вам нужно.Как я могу подавить диалог Just My Code при использовании испускаемого кода IL?

Однако, когда я включаю Just My Code, отладчик прерывается, когда мой внутренний код пользователя сначала бросает Исключение. Это нежелательное поведение - внутренний код завернут в try/catch (через испущенный IL), поэтому он обрабатывается, и я не хочу, чтобы всплывал диалог Exception.

Я подозреваю, что диалог появляется, потому что Исключение переходит от кода пользователя (InternalMethod) к «не-пользовательскому коду» (испускаемый ИЛ), поскольку испущенный IL показывает как «[Внешний код]» в вызове стек. Можно ли пометить испущенный код IL как код пользователя, чтобы исключение прошло, не вызывая Just My Code для отображения диалогового окна «Исключение»?

using System; 
using System.Reflection; 
using System.Reflection.Emit; 
using System.Threading; 

namespace ExceptionInEmitDemo 
{ 
    public class Program 
    { 
     static void Main(string[] args) 
     { 
      var internalMethod = typeof(Program).GetMethod("InternalMethod", BindingFlags.Public | BindingFlags.Static); 

      var assembly = Thread.GetDomain().DefineDynamicAssembly(new AssemblyName("DynamicAssembly"), AssemblyBuilderAccess.Run); 
      var moduleBuilder = assembly.DefineDynamicModule("DynamicModule", false); 
      var typeBuilder = moduleBuilder.DefineType("DynamicType"); 
      var methodBuilder = typeBuilder.DefineMethod("DynamicMethod", MethodAttributes.Public | MethodAttributes.Static, typeof(void), new Type[] { }); 
      var ilGen = methodBuilder.GetILGenerator(); 
      ilGen.Emit(OpCodes.Call, internalMethod); 
      ilGen.Emit(OpCodes.Ret); 
      var dynamicType = typeBuilder.CreateType(); 

      MethodInfo dynamicMethod = dynamicType.GetMethod("DynamicMethod"); 
      try 
      { 
       dynamicMethod.Invoke(null, new object[] { }); 
      } 
      catch (TargetInvocationException ex) 
      { 
       Console.WriteLine("Caught Exception: " + ex.InnerException); 
      } 
     } 

     public static void InternalMethod() 
     { 
      throw new Exception("This Exception will be caught in the try/catch block"); 
     } 
    } 
} 

ответ

1

Я думаю, что проблема может быть, что есть еще внешний код участвует код MethodInfo.Invoke() методы.

Вы можете либо добавить DebuggerNonUserCodeAttribute к вызванному методу, но это, скорее всего, нежизнеспособно.

Или вы можете создать делегат для целевого метода.

try 
{ 
    var d = (Action)dynamicMethod.CreateDelegate(typeof(Action)); 
    d(); 
} 
catch (Exception ex) 
{ 
    Console.WriteLine("Caught Exception: " + ex); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^