微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决重新定义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){
}
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。