问题描述
|
我正在尝试(为了好玩)将
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){
}