2016-04-22 8 views
1

ユーザーコードを呼び出すILコードをいくつか発行しました。私は試して/キャッチブロック内で発生するすべての例外をキャッチする私のILコード(ユーザーコードから)の呼び出しをラップします。内側のユーザーコードは、外側のユーザーコードのtry/catchブロックによって適切に捕捉された例外をスローします。これはすべて望ましいものです。放射されたILコードを使用しているときにどのようにJust My Codeダイアログを表示しないようにできますか?

ただし、私のコードをオンにすると、内部ユーザーコードが最初に例外をスローする場所でデバッガがブレークします。これは望ましくない動作です。内部コードはtry/catch(放射されたILを介して)にラップされるため、処理され、例外ダイアログがポップアップしないようにします。

発生したILがコール中に「[外部コード]」として表示されているので、例外がユーザコード(InternalMethod)から「非ユーザコード」(発行されたIL)に渡されているためダイアログがポップアップしている可能性がありますスタック。発行されたILコードをユーザコードとしてマークすることができます。これにより、My CodeだけでExceptionダイアログを表示せずにExceptionが通過するようになりますか?

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); 
} 
関連する問題