7

好的,我承认这段代码对你来说看起来很奇怪,那是因为它很奇怪。这只是重现行为的代码,而不是我想使用的代码。

class Program
{
    static void Main(string[] args)
    {
        try
        {
            Activator.CreateInstance(typeof(Func<int>), new object[] { new object(), IntPtr.Zero });
        }
        catch
        {
            Console.WriteLine("This won't print!");
        }

        Console.Write("Actually this will not print either!");
        Console.ReadLine();
    }
}

无论我尝试捕获哪种异常类型(据我所知,实际抛出的异常是 ArgumentException),catch 块内的代码都不会执行。实际上执行将在 Activator.CreateInstance 行停止。

4

2 回答 2

4

您已经用该代码轰炸了 CLR。感人的。实际的事故是垃圾收集堆的损坏,它通过 ExecutionEngineException 发出信号。显然,损坏程度足以阻止 CLR 执行异常处理程序。

您可以在 connect.microsoft.com 上报告此情况。但是,该错误在 .NET 4.0 中已修复,它会生成正确的异常 ArgumentNullException,“值不能为空,参数名称:方​​法”。解决方法很明显,当它需要一个非空字符串时不要传递 IntPtr.Zero。

于 2010-05-10T15:39:51.320 回答
1

当我在 .NET 3.5 中运行此代码时,我得到一个ExecutionEngineException. 当运行时抛出此异常时,它类似于调用Environment.FailFast. 显然这是堆内存损坏的症状。

当我将您的示例代码切换到以下代码时,就会实现正确的行为。

Activator.CreateInstance(
    typeof(Func<int>), 
    new object[] { IntPtr.Zero, new object() }
);

我很清楚这带来的问题多于答案...... :)

于 2010-05-10T14:26:19.110 回答