Мое приложение C # отправляет мне трассировку стека, когда оно генерирует необработанное исключение, и я сейчас смотрю на одно, которое не понимаю.
Похоже, это не моя вина, но обычно, когда я думаю, что впоследствии я ошибался. 8-) Вот трассировка стека:
mscorlib caused an exception (ArgumentOutOfRangeException): startIndex cannot be larger than length of string.
Parameter name: startIndex
System.String::InternalSubStringWithChecks(Int32 startIndex, Int32 length, Boolean fAlwaysCopy) + 6c
System.String::Substring(Int32 startIndex) + 0
System.IO.Directory::InternalGetFileDirectoryNames(String path, String userPathOriginal, String searchPattern, Boolean includeFiles, Boolean includeDirs, SearchOption searchOption) + 149
System.IO.Directory::GetFiles(String path, String searchPattern, SearchOption searchOption) + 1c
System.IO.Directory::GetFiles(String path) + 0
EntrianSourceSearch.Index::zz18ez() + 19b
EntrianSourceSearch.Index::zz18dz() + a
Таким образом, мой код (запутанные имена функций в конце) вызывает System.IO.Directory.GetFiles(path)
, что приводит к ошибке индексации строки.
К сожалению, я не знаю значение path
, которое было передано, но независимо от этого, конечно, не может быть для System.IO.Directory::GetFiles
сбой таким образом? Попробуйте, как я мог, я не могу придумать аргумента к GetFiles
, который воспроизводит крах.
Я действительно смотрю на ошибку во время выполнения .NET, или есть что-то, что могло бы на законных основаниях вызвать это исключение? (Я мог бы понять, что что-то пошло не так, если каталог был изменен в то время, когда я звонил GetFiles
, но я бы не ожидал исключения индексации строки в этом случае.)
Редактировать : Спасибо всем за их мысли! На данный момент наиболее вероятная теория состоит в том, что есть путь с хитрыми не-BMP символами Unicode, но я все еще не могу его сломать. Глядя на код в GetFiles
с помощью Reflector, я думаю, что единственный способ, которым он может сломаться, - это GetDirectoryName()
, чтобы вернуть путь, который на длиннее , чем его вход, даже когда его вход уже полностью нормализован. Bizarre. Я пытался создать пути с не-BMP символами в (у меня никогда не было каталога с именем {MUSICAL SYMBOL
G CLEF} до 8-), но я все еще не могу сломать его.
Что я сделал, так это добавил дополнительную регистрацию вокруг ошибочного кода (и убедился, что моя регистрация работает с не-BMP символами!). Если это случится снова, у меня будет намного больше информации.