【发布时间】:2016-02-17 18:37:15
【问题描述】:
我刚刚使用 DotPeek 反编译了一些第 3 方源来调试问题。输出代码包含一些不寻常的运算符,AFAIK 不是有效的 C#,所以我想知道它们是什么意思......
摘录看起来像(包括 Dotpeek cmets,因为它们可能是相关的);
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 的等效 sn-p,这更有意义,我猜 C# 的反编译没有产生有效的等效?
'C#'
int& local = @Written;
byte[] numArray2 = this.FInSpool;
int num = (int) __Global.Min(numArray2 == null ? 0L : (long) numArray2.Length, (long) MaxSize);
^local = num;
IL
byte[] expr_22 = this.FInSpool;
Written = (int)__Global.Min((long)((expr_22 == null) ? 0 : expr_22.Length), (long)MaxSize);
所以,我猜“C#”不是很有效?该 IL 将是有效的 C#,不确定为什么 DotPeek 会产生它所做的输出。也许我会为这个坚持使用 ILSpy...?
【问题讨论】:
-
你确定你把它反编译成C#了吗?那些是 C++/CLI 操作符。
-
我的猜测是
^local与Written是一个输出参数这一事实有关。它似乎正在取消引用指针。 -
我认为 int& 不是 C# 中的有效术语?如果可能的话,你能粘贴原始的 MSIL 吗? C# 只公开了 MSIL 的一个子集,因此它要么被错误地反编译,要么源语言不是 C#。
-
您能否向我们展示 a) IL 和 b) C# 中的 Reflector 输出以及 c) 原始源代码? MSIL 经常在内部使用(安全!)托管指针。你正在看到他们的表现。
-
@usr -> b) 不抱歉,没有 Reflector 的许可证。 c) 不,它是非开源的第 3 方代码。将添加 IL,它确实使事情更清晰。