【发布时间】:2012-08-06 02:39:38
【问题描述】:
下面的示例代码自然而然地发生了。突然间,我的代码出现了一个听起来很讨厌的FatalExecutionEngineError 异常。我花了整整 30 分钟试图隔离和最小化罪魁祸首样本。使用 Visual Studio 2012 作为控制台应用程序进行编译:
class A<T>
{
static A() { }
public A() { string.Format("{0}", string.Empty); }
}
class B
{
static void Main() { new A<object>(); }
}
应该在 .NET 框架 4 和 4.5 上产生此错误:
这是一个已知的错误,原因是什么,我可以做些什么来缓解它?我目前的工作是不使用string.Empty,但我是不是找错了树?更改有关该代码的任何内容都会使其按预期运行 - 例如删除 A 的空静态构造函数,或将类型参数从 object 更改为 int。
我在我的笔记本电脑上尝试了这段代码,它没有抱怨。但是,我确实尝试了我的主应用程序,但它也在笔记本电脑上崩溃了。我一定是在减少问题时弄坏了一些东西,我看看能不能弄清楚那是什么。
我的笔记本电脑使用与上述相同的代码崩溃,使用框架 4.0,但即使使用 4.5,主也会崩溃。两个系统都使用带有最新更新的 VS'12(7 月?)。
更多信息:
- IL 代码(已编译 Debug/Any CPU/4.0/VS2010(IDE 不重要?)):http://codepad.org/boZDd98E
- 没有看到 VS 2010 与 4.0。在有/没有优化、不同的目标 CPU、附加/未附加调试器等情况下不会崩溃 - Tim Medora
- 如果我使用 AnyCPU 会在 2010 年崩溃,但在 x86 中很好。在 Visual Studio 2010 SP1 中崩溃,使用 Platform Target = AnyCPU,但使用 Platform Target=x86 很好。这台机器也安装了 VS2012RC,所以 4.5 可能会进行就地更换。使用 AnyCPU 和 TargetPlatform = 3.5 然后它不会崩溃,所以看起来像是框架中的回归。-colinsmith
- 无法在 VS2010 4.0 中的 x86、x64 或 AnyCPU 上重现。 – Fuji
- 仅适用于 x64,(2012rc, Fx4.5) - Henk Holterman
- Win8 RP 上的 VS2012 RC。最初针对 .NET 4.5 时未看到此 MDA。当切换到面向 .NET 4.0 时,MDA 出现了。然后在切换回 .NET 4.5 后,MDA 仍然存在。 - Wayne
【问题讨论】:
-
我从来不知道你可以创建一个静态构造函数和一个公共构造函数。哎呀,我从来不知道存在静态构造函数。
-
我有一个想法:因为您正在将 B 从某种静态类更改为仅具有静态 Main 的类?
-
@ChrisSinclair,我不这么认为。我的意思是我在笔记本电脑上测试了这段代码,得到了相同的结果。
-
@ColeJohnson 是的,除了一个明显的地方,IL 在所有地方都匹配。 c# 编译器中似乎没有任何错误。
-
感谢原始发帖人在此报道,感谢 Michael 出色的分析。我在 CLR 上的同行试图在这里重现这个错误,发现它在 64 位 CLR 的“候选发布”版本上重现,但在最终的“发布到制造”版本上没有重现,该版本在发布后修复了许多错误钢筋混凝土。 (RTM 版本将于 2012 年 8 月 15 日向公众提供。)因此,他们认为这与此处报告的问题相同:connect.microsoft.com/VisualStudio/feedback/details/737108/…