以下代码正常工作,直到我升级到.NET 4(x64)
namespace CrashME
{
class Program
{
private static volatile bool testCrash = false;
private static void Crash()
{
try
{
}
finally
{
HttpRuntime.Cache.Insert("xxx", testCrash);
}
}
static void Main(string[] args)
{
Crash();
// Works on .NET 3.5 , crash on .NET 4
}
}
}
我刚刚发现了运行时错误,还是我的使用存在问题?
答案 0 :(得分:5)
这似乎是CLR中的一个错误 - 您应该将其报告给Microsoft。
请注意StackOverflowException
发生 CLR尝试执行Crash
,而不是执行Crash
期间方法 - 程序实际上从不进入方法。这似乎表明这是CLR中的一些低级故障。 (另请注意,抛出的异常也没有堆栈跟踪)。
此异常非常特定于这种情况 - 更改任何一项修复此问题,例如以下代码正常工作:
private static void Crash()
{
bool testCrash2 = testCrash;
try { }
finally
{
HttpRuntime.Cache.Insert("xxx", testCrash2);
}
}
我建议您向Microsoft报告,但尝试通过在此期间调整代码来解决此问题。
答案 1 :(得分:3)
我可以在x86机器上重现它。以下代码也失败了:
try
{
}
finally
{
var foo = new List<object>();
foo.Add(testCrash);
}
但是,以下代码成功:
try
{
}
finally
{
var foo = new List<bool>();
foo.Add(testCrash);
}
我认为它可能与finally块中的volatile字段的装箱有关,但后来我尝试了以下(也失败了):
try
{
}
finally
{
bool[] foo = new bool[1];
foo[0] = testCrash;
}
非常有趣的问题......