重新定义String.Empty后使用Console.Writeline时“检测到FatalExecutionEngineError”

时间:2011-05-24 07:16:48

标签: c# visual-studio-2010 clr

我正在尝试(为了好玩)将String.Empty重新定义为单个空格“”。为什么这会破坏CLR框架?

消息:

  

运行时遇到过   致命错误。错误的地址   位于0x5814b976,位于线程0xf40上。   错误代码是0x80131623。这个   错误可能是CLR或中的错误   不安全或不可核实的部分   用户代码这个的常见来源   错误包括用户编组错误   COM-interop或PInvoke,可能   腐败堆栈。

如何重现:

class Program
{
    static void Main()
    {
        typeof(string).GetField("Empty").SetValue(null, " ");
        Console.WriteLine("{}", "");
    }
}

1 个答案:

答案 0 :(得分:2)

如果我们查看该计划

class Program
{
    static void Main()
    {
        Console.WriteLine("{}", "");
    }
}

然后它会失败并显示错误消息FormatException的{​​{1}}。

但是,当我们在Input string was not in a correct format行之前插入typeof(string).GetField("Empty").SetValue(null, " ");时,代码在尝试查找该错误消息时失败。如果我们查看完整的堆栈跟踪(包括“显示外部代码”),那么我们会看到代码在Console.WriteLine处失败(注意mscorlib.resources前面的空格)。

原因是System.Resources.ManifestBasedResourceGroveler.HandleResourceStreamMissing(string fileName = " mscorlib.resources")使用ManifestBasedResourceGroveler的元代码GetResourceFileName来查找资源文件。在ResourceManager中,我们使用GetResourceFileName构建文件名,StringBuilder的构造函数以StringBuilder开头。

String.Empty