我正在尝试(为了好玩)将String.Empty
重新定义为单个空格“”。为什么这会破坏CLR框架?
消息:
运行时遇到过 致命错误。错误的地址 位于0x5814b976,位于线程0xf40上。 错误代码是0x80131623。这个 错误可能是CLR或中的错误 不安全或不可核实的部分 用户代码这个的常见来源 错误包括用户编组错误 COM-interop或PInvoke,可能 腐败堆栈。
如何重现:
class Program
{
static void Main()
{
typeof(string).GetField("Empty").SetValue(null, " ");
Console.WriteLine("{}", "");
}
}
答案 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