Проблемы с компиляцией некоторого декомпилированного кода C # - PullRequest
2 голосов
/ 24 декабря 2010

Я декомпилировал проект с открытым исходным кодом (потому что исходный код для последней версии еще не выпущен). Используя инструмент рефлектора RedGate, он дал мне этот блок кода:

if(somecondition == true)
{
    ref Vector3i vectoriRef;
    float num17 = length - num;
    Vector3i end = vectori3;
    (vectoriRef = (Vector3i) &end)[1] = vectoriRef[1] - ((int) num17);
}

somecondition - логическое значение. length и num являются числами, определенными вне кода. vectori3 также определяется вне кода и имеет тип Vector3i. Тип Vector3i, по сути, является этим кодом , но x, y и z хранятся как целые числа.

Когда я пытаюсь скомпилировать этот декомпилированный код, я получаю следующие ошибки:

  • Строка 2: только операторы присваивания, вызова, приращения, уменьшения и нового выражения объекта могут использоваться в качестве оператора
  • Строка 3:; Ожидается
  • Строка 3: недопустимый термин "ref"
  • Строка 6: «Vector3i» является «типом», но используется как «переменная»

Есть мысли о том, как я могу исправить этот код, чтобы он правильно компилировался и делал то, для чего он предназначен?

ОБНОВЛЕНИЕ: Оказывается, источник доступен в их хранилище, но вы должны следовать лабиринту ссылок и подсказок, чтобы даже найти его. Спасибо всем, кто написал!

Ответы [ 2 ]

3 голосов
/ 24 декабря 2010

В коде используется тип изменяемого значения, что является «наихудшей практикой» в C #.Код, который мы генерируем для типов изменяемых значений, может быть довольно сложным для правильного анализа и декомпиляции;по-видимому, вы столкнулись с ошибкой в ​​движке декомпиляции.C # не поддерживает данный синтаксис.(Это может произойти в будущем; я написал прототип «ref localals», и он работает довольно хорошо, но не ясно, что эта функция на самом деле достаточно ценна для клиентов, чтобы гарантировать полный дизайн и реализацию.)

Внимательно прочитайте код, и вы поймете, что он делает: он делает копию вектора i в конец, а затем получает ссылку на конец (помните, "это" при вызове значенияТип всегда является ссылкой на переменную, потому что вызов может изменять содержимое этой переменной.) Затем он использует ref для изменения переменной. Но почему ?? Этот код не имеет никакого смысла . Зачем вам делать локальную копию переменной, а затем изменять ее, а затем отбрасывать измененную копию?

Я подозреваю, что вы обнаружили не только ошибку в декомпиляторе;возможно, вы также нашли ошибку в коде.

1 голос
/ 24 декабря 2010

На первый взгляд

if (somecondition)
{
    vectori3[1] -= (int)(length - num);
}

Я не совсем уверен насчет явного эталонного синтаксиса - я никогда раньше этого не видел и не могу заставить VS принять его - но последняя строка выделяетсяв

vectoriRef = (Vector3i) &end;
vectoriRef[1] = vectoriRef[1] - ((int) num17);
...