«Обнаружен FatalExecutionEngineError» при использовании Console.Writeline после переопределения String.Empty - PullRequest
2 голосов
/ 24 мая 2011

Я пытаюсь (для забавы) переопределить String.Empty, чтобы он был одним пробелом "". Почему это нарушает структуру CLR?

Сообщение:

Среда выполнения обнаружила фатальная ошибка. Адрес ошибки был в 0x5814b976, в потоке 0xf40. Код ошибки 0x80131623. это ошибка может быть ошибкой в ​​CLR или в небезопасные или не проверяемые части кода пользователя. Общие источники этого ошибка включает ошибки маршалинга пользователя для COM-взаимодействие или PInvoke, которые могут повредить стек.

Как воспроизвести:

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

1 Ответ

2 голосов
/ 09 мая 2012

Если мы посмотрим на программу

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

, то произойдет сбой с FormatException с сообщением об ошибке Input string was not in a correct format.

Однако, когда мы вставляем typeof(string).GetField("Empty").SetValue(null, " "); перед строкой с Console.WriteLine, код не работает, когда пытается найти это сообщение об ошибке.Если мы посмотрим на полную трассировку стека (включая «Показать внешний код»), то увидим, что код завершается с ошибкой System.Resources.ManifestBasedResourceGroveler.HandleResourceStreamMissing(string fileName = " mscorlib.resources") (обратите внимание на пространство перед mscorlib.resources).

Причина этого заключается в том, чтоManifestBasedResourceGroveler использует метод GetResourceFileName из ResourceManager для поиска файла ресурса.И в GetResourceFileName мы используем StringBuilder для создания имени файла, а конструктор StringBuilder начинается с String.Empty.

public StringBuilder(int capacity)
    : this(String.Empty,capacity){
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...