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

问题描述

| 我正在尝试(为了好玩)将
String.Empty
重新定义为单个空格\“
\”。为什么这会破坏CLR框架? 信息:   运行时遇到了   致命错误错误地址   在线程0xf40上位于0x5814b976。   错误代码为0x80131623。这个   错误可能是CLR或   不安全或不可验证的部分   用户代码。常见的来源   错误包括以下用户的封送处理错误   COM互操作或PInvoke,这可能   破坏堆栈。 繁殖方法
class Program
{
    static void Main()
    {
        typeof(string).GetField(\"Empty\").SetValue(null,\" \");
        Console.WriteLine(\"{}\",\"\");
    }
}
    

解决方法

如果我们看一下程序
class Program
{
    static void Main()
    {
        Console.WriteLine(\"{}\",\"\");
    }
}
它将以错误消息
Input string was not in a correct format
FormatException
失败。 但是,当我们在带有
Console.WriteLine
的行之前插入
typeof(string).GetField(\"Empty\").SetValue(null,\" \");
时,当它尝试查找该错误消息时代码将失败。如果查看完整的堆栈跟踪(包括\“ Show external code \”),则会发现该代码在
System.Resources.ManifestBasedResourceGroveler.HandleResourceStreamMissing(string fileName = \" mscorlib.resources\")
处失败(请注意mscorlib.resources前面的空格)。 原因是
ManifestBasedResourceGroveler
使用
ResourceManager
的方法
GetResourceFileName
查找资源文件。在
GetResourceFileName
中,我们使用
StringBuilder
来构造文件名,而
StringBuilder
的构造函数以
String.Empty
开头。
public StringBuilder(int capacity)
    : this(String.Empty,capacity){
}