pt 2,无法捕捉的例外

dev*_*os1 22 c# reflection clr invoke methodinfo

更新:我已经在Microsoft Connect上提交了错误报告:https://connect.microsoft.com/VisualStudio/feedback/details/568271/debugger-halting-on-exception-thrown-inside-methodinfo-invoke#details

如果您可以在您的机器上重现此问题,请提供错误,以便修复它!


好的,我已经做了一些测试,我把问题简化为非常简单的事情:

一世.在抛出异常的新类中创建方法:

public class Class1 {
    public void CallMe() {
        string blah = null;
        blah.ToLower();
    }
}
Run Code Online (Sandbox Code Playgroud)

II.创建一个MethodInfo,在其他地方指向此方法:

Type class1 = typeof( Class1 );
Class1 obj = new Class1();
MethodInfo method = class1.GetMethod( "CallMe" );
Run Code Online (Sandbox Code Playgroud)

III.在try/catch块中包含对Invoke()的调用:

try {
    method.Invoke( obj, null ); // exception is not being caught!
} catch {
}
Run Code Online (Sandbox Code Playgroud)

IV.没有调试器运行程序(工作正常).

v.现在使用调试器运行程序.发生异常时,调试器将暂停程序,即使它包含在试图忽略它的catch处理程序中.(即使你在catch块中放置了一个断点,它会在它到达之前停止!)

实际上,在没有调试器的情况下运行它时会发生异常.在一个简单的测试项目中,它在某个其他级别被忽略,但如果您的应用程序有任何类型的全局异常处理,它也会在那里被触发. [看评论]

这让我很头疼,因为它一直在触发我的应用程序的崩溃处理程序,更不用说尝试调试的痛苦了.

Dav*_*kle 5

我可以在我的.NET 4机器上重现这一点,你说得对 - 它只发生在.NET 4.0上.

这对我来说非常像臭虫,应该继续使用MS Connect. 如果这是绊倒你的崩溃处理程序,那么主要是糟糕的.听起来像解决这个问题的一种不愉快的方法是将调用的方法包装在自己的处理程序中.:-(

但是,我无法重现的一件事是绊倒崩溃处理程序.这是我的计划:

namespace trash {
    public class Class1 {
        public void CallMe() {
            string blah = null;
            blah.ToLower();
        }
    }

    class Program {
        static void Main(string[] args) {
            AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);           
            var class1 = typeof(Class1);
            var method = class1.GetMethod("CallMe");

            try {
                var obj = new Class1();
                method.Invoke(obj, null); // exception is not being caught!
            }
            catch (System.Reflection.TargetInvocationException) {
                Console.Write("what you would expect");
            }

        }

        static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) {
            Console.Write("it would be horrible if this got tripped but it doesn't!");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)