开发者

"FatalExecutionEngineError was detected" when using Console.Writeline after redefining String.Empty

I'm trying (for fun) to redefine String.Empty to be a single space "". Why does this break the CLR framework?

Message:

The runtime has encountered a fatal error. The address of the error was at 0x5814b976, on thread 0xf40. The error code is 0x80131623. This 开发者_高级运维 error may be a bug in the CLR or in the unsafe or non-verifiable portions of user code. Common sources of this bug include user marshaling errors for COM-interop or PInvoke, which may corrupt the stack.

How to reproduce:

class Program
{
    static void Main()
    {
        typeof(string).GetField("Empty").SetValue(null, " ");
        Console.WriteLine("{}", "");
    }
}


If we look at the program

class Program
{
    static void Main()
    {
        Console.WriteLine("{}", "");
    }
}

then it will fail with an FormatException with the error message Input string was not in a correct format.

However when we insert typeof(string).GetField("Empty").SetValue(null, " "); before the line with Console.WriteLine then the code fails when it tries to look up that error message. If we look at the full stacktrace (including "Show external code") then we see that the code fails at System.Resources.ManifestBasedResourceGroveler.HandleResourceStreamMissing(string fileName = " mscorlib.resources") (notice the space in front of mscorlib.resources).

The reason for this is that ManifestBasedResourceGroveler uses the metode GetResourceFileName of ResourceManager to find the resource file. And in GetResourceFileName we use a StringBuilder to construct the filename and the constructor of StringBuilder starts with String.Empty.

public StringBuilder(int capacity)
    : this(String.Empty,capacity){
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜