Функция PrivateImplementationDetails при декомпиляции C #

2

Я перестраиваю библиотеку, запрограммированную на С#, и нуждаюсь в помощи с оператором Switch, у меня есть следующий фрагмент кода, использующий <PrivateImplementationDetails>.ComputeStringHash() сгенерированную во время компиляции. Мой вопрос: какова функция, которую я должен использовать? sss.GetHashCode() ли я тот же результат с помощью sss.GetHashCode()?

В настоящее время ошибка, представленная мне, не Can not resolve symbol 'PrivateImplementationDetails'.

 switch (<PrivateImplementationDetails>.ComputeStringHash(sss)) {
    case 0x1315fc:
        if (sss == "ASD") {
            break;
        }
        goto Label_0105;

    case 0x15c3dc:
        if (sss == "JKL") {
            break;
        }
        goto Label_0105;
 }
  • 4
    Ваш декомпилятор не достаточно умен, чтобы распознать эту конструкцию, что несколько понятно, так как этот код был добавлен совсем недавно. Оригинальный код просто имел switch (sss) { case "ASD": etc } . Генерация хеша делает это намного быстрее.
  • 0
    @HansPassant Итак, если я буду использовать sss.GetHashCode() вместо перекодирования переключателя (переключатель очень длинный), это будет работать? Спасибо
Показать ещё 1 комментарий
Теги:
reverse-engineering
decompiling

2 ответа

0
Лучший ответ

В то время, когда задавался вопрос, генерируемый ИЛ был относительно новым, поэтому декомпиляторы не обновлялись для его поддержки. По сути декомпилятор обнаружил некоторые из базового кода платформы.NET и хэш-функцию, используемую для поддержки операторов строковых коммутаторов.

Теперь, через год или около того, декомпиляторы были обновлены, поэтому они должны просто показать оператор switch следующим образом:

switch (sss)
{
    case "ASD":
    // do something
    break;
    case "JKL":
    // do something
    break
}

Я тестировал это с помощью DotPeek и могу подтвердить, что это правильно показывает.

-1

Этот код ниже является правильным для запуска вашего кода без каких-либо ошибок:

internal sealed class PrivateImplementationDetails
{
    internal static uint ComputeStringHash(string s)
    {
        uint num = new uint();
        if (s != null)
        {
            num = 0x811c9dc5;
            for (int i = 0; i < s.Length; i++)
            {
                num = (s[i] ^ num) * 0x1000193;
            }
        }
        return num;
    }
}

И удалите <> вокруг PrivateImplementationDetails

  • 0
    Но почему, когда Ганс уже объяснил, что это было просто недоразумение декомпилятора, этот код актуален? И насколько вероятно, что он будет полезен для OP через год (или вообще для кого-то еще, когда большинство декомпиляторов уже будут обновлены, чтобы справиться с этим)?
  • 0
    И это также ответ только для кода с небольшим объяснением того, что он делает или почему он работает. Вы могли бы по крайней мере упомянуть, что это алгоритм FNV-1a, или указать на исходный код C # , на который вы, без сомнения, ссылались, чтобы получить это.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню