14

我刚刚使用 DotPeek 反编译了一些 3rd 方源来调试问题。输出代码包含一些不寻常的运算符,AFAIK 不是有效的 C#,所以我想知道它们是什么意思......

摘录看起来像(包括 Dotpeek 评论,因为它们可能是相关的);

protected internal void DoReceive(ref byte[] Buffer, int MaxSize, out int Written)
{
    Written = 0;
    .
    .
    .        
    // ISSUE: explicit reference operation
    // ISSUE: variable of a reference type
    int& local = @Written;
    int num = SomeMethod();
    .
    .
    .
    // ISSUE: explicit reference operation
    ^local = num;
}

那么,那里有 3 个不寻常的运算符......int& = @Written似乎正在将一个指针分配给一个用 @ 字符毫无意义地命名的变量?

但什么是^local = num;???

好的,这是来自 ILSpy 的等效片段,这更有意义,我猜 C# 的反编译没有产生有效的等效项?

'C#'

 int& local = @Written;
 byte[] numArray2 = this.FInSpool;
 int num = (int) __Global.Min(numArray2 == null ? 0L : (long) numArray2.Length, (long) MaxSize);
 ^local = num;

伊利诺伊州

 byte[] expr_22 = this.FInSpool;
 Written = (int)__Global.Min((long)((expr_22 == null) ? 0 : expr_22.Length), (long)MaxSize);

所以,我猜“C#”不是很有效?该 IL 将是有效的 C#,不确定为什么 DotPeek 会产生它所做的输出。也许我会为此坚持使用 ILSpy ......?

4

3 回答 3

9

如果您查看原始 IL(来自 ildasm,而不是通过 IL Spy 获得的 C# 等效项),这可能会帮助您了解反编译器想要表达的内容。'Out' 参数使用(托管)类型引用表示,该引用未明确公开为 C# 中的类型。这种类型的“实例”通常只能作为参数传递给接受类型化引用(“ref”或“out”参数)的方法。有关更多信息,请参见OpCodes.Mkrefany

dotPeek 抱怨的是,这个“输出”类型的引用是从参数存储到局部变量槽中的,然后稍后通过局部槽写入。'@' 和 '^' 是占位符,用于指示反编译器检测到的这种意外行为(ISSUE 评论描述的行为。)

代码可能是从 C++/CLI 编译的,因此 IL 看起来与典型的 C# 编译器输出不同。这也可能是某种程度的轻微混淆来混淆反编译器(尽管我不这么认为。)我认为这在功能上与将引用从其参数直接加载到操作堆栈上没有任何不同(避免使用一个局部变量插槽),但我可能是错的。

于 2012-12-17T23:32:33.623 回答
3

将 a 放在@名称之前允许您为变量使用保留名称,例如,如果我想要一个名为的变量,return我需要这样做。

public int Weird()
{
    int @return = 0;
    return @return;
}

有关更多详细信息,请参阅此 SO 问题


在名字前加一个^……嗯,不知道。(将在我研究时更新,^我可以找到有关不用作 XOR 时的含义的任何信息)

于 2012-12-17T22:30:53.600 回答
0

这显然是一个反编译问题。由于支持广泛的语言集,任何特定语言的反编译器可能并不总能找到精确匹配,但仍会尝试产生一些输出。反编译器可能会尝试产生一些等效的输出,例如在这种情况下可能是:

protected internal void DoReceive(ref byte[] Buffer, int MaxSize, out int Written)
{
    Written = 0;
    .        
    int num = SomeMethod();
    .
    Written = num;
}

但它真的应该这样做吗?在这种情况下,反编译器实际上为您提供了一个提示,因此您可以决定这对您的特定情况是否重要,因为可能会有一些副作用。

于 2013-04-02T15:01:23.360 回答