2016-04-22 16 views
1

我發出了一些調用用戶代碼的IL代碼。我將我的IL代碼(來自用戶代碼)的調用封裝在try/catch塊中,以捕獲其中發生的任何異常。內部用戶代碼會拋出一個由外部用戶代碼的try/catch塊正確捕獲的異常。這是所有需要的。當使用發射的IL代碼時,如何禁用「只是我的代碼」對話框?

但是,當我打開只是我的代碼,調試器打破了我的內部用戶代碼第一次拋出異常的地方。這是不受歡迎的行爲 - 內部代碼被封裝在try/catch中(通過發出的IL),所以它被處理,我不想讓Exception對話框彈出。

我懷疑彈出的對話框是因爲發出的IL在呼叫中顯示爲「[External code]」,因此Exception從用戶代碼(InternalMethod)傳遞到「非用戶代碼」(發出的IL)疊加。是否有可能將發出的IL代碼標記爲用戶代碼,以便異常通過而不會導致只是我的代碼顯示異常對話框?

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); 
} 
相關問題