我發出了一些調用用戶代碼的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");
}
}
}