无法编译一些反编译的C#代码

时间:2010-12-24 15:45:13

标签: c# .net compiler-errors decompiling

我正在反编译一个开源项目(因为最新版本的源尚未发布)。使用RedGate的Reflector工具,它给了我这段代码:

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

somecondition是一个布尔值。 lengthnum是代码外部定义的浮点数。 vectori3也在代码之外定义,类型为Vector3i。类型Vector3i is essentially this code,但x,y和z存储为整数。

当我尝试编译这个反编译代码时,我收到以下错误:

  • 第2行:只能将赋值,调用,递增,递减和新对象表达式用作语句
  • 第3行:;预期
  • 第3行:无效的表达式术语'ref'
  • 第6行:'Vector3i'是'type',但用作'variable'

有关如何修复此代码的任何想法,以便正确编译并执行任何预期的操作?

更新:事实证明,他们的存储库中提供了源 ,但您必须遵循迷宫般的链接和线索才能找到它。感谢所有发布的人!

2 个答案:

答案 0 :(得分:3)

代码使用可变值类型,这是C#中的“最差实践”。我们为可变值类型生成的代码很难正确分析和反编译;显然你遇到了反编译引擎中的一个错误。 C#不支持给定的语法。 (它可能在未来;我已经编写了“ref locals”的原型并且它的工作非常好,但是不清楚该功能对于客户来说实际上是否足以保证完整的设计和实现。)

仔细阅读代码,你会看到它正在做什么:它正在将vector3的副本设置为end,然后获得一个ref结束(记住,调用的是“this”)值类型始终是对变量的引用,因为调用可能会改变该变量的内容。)然后它使用ref来变量变量。 但为什么?? 此代码不会产生任何为什么要制作变量的本地副本然后改变副本,然后丢弃变异副本?

我怀疑你不仅在反编译器中发现了一个错误;您可能还在代码中发现了一个错误。

答案 1 :(得分:1)

乍一看

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

我不清楚明确的引用语法 - 我之前从未见过,并且无法让VS接受它 - 但是最后一行分成了

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