好的,我承认这段代码看起来很奇怪,那是因为很奇怪。这只是重现行为的代码,而不是我想要使用的代码。
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行。
答案 0 :(得分:4)
你用该代码轰炸了CLR。令人印象深刻。实际的不幸事件是垃圾收集堆的损坏,它用ExecutionEngineException发出信号。显然,损坏足以阻止CLR执行异常处理程序。
您可以在connect.microsoft.com上报告此问题。但是,该错误在.NET 4.0中得到修复,它会生成正确的异常,ArgumentNullException,“Value不能为null,参数名称:方法”。解决方法很明显,当它需要非空字符串时,不要传递IntPtr.Zero。
答案 1 :(得分:1)
当我在.NET 3.5中运行此代码时,我得到ExecutionEngineException
。当运行时抛出此异常时,它类似于调用Environment.FailFast
。显然,这是堆上内存损坏的症状。
当我将示例代码切换到以下内容时,会实现正确的行为。
Activator.CreateInstance(
typeof(Func<int>),
new object[] { IntPtr.Zero, new object() }
);
我很清楚这会带来更多问题而不是答案......:)