Я испустил некоторый 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");
}
}
}