如何解决重新定义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 举报,一经查实,本站将立刻删除。