我偶然发现了这个问题,询问 linq 的聚合算法,并认为这是逆向工程最好回答的问题,所以我去了 Visual Studio 并编写了以下代码(此代码旨在用于紧凑框架项目其中 Combine 函数只能有两个参数):
public static string Combine(string path1, params string[] paths)
{
return paths.Aggregate(path1, System.IO.Path.Combine);
}
然后我将光标设置为 Aggregate 方法,按 F12 键(我安装了 Resharper),并被引导到以下代码:
// Decompiled with JetBrains decompiler
// Type: System.Linq.Enumerable
// Assembly: System.Core, Version=3.9.0.0, Culture=neutral, PublicKeyToken=969db8053d3322ac, Retargetable=Yes
// MVID: 77D23A6E-E19D-435B-9CBB-733D74F92072
// Assembly location: C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\WindowsEmbeddedCompact\v3.9\System.Core.dll
Lots of stuff...
public static TAccumulate Aggregate<TSource, TAccumulate>(this IEnumerable<TSource> source, TAccumulate seed, Func<TAccumulate, TSource, TAccumulate> func)
{
// Stub method ('ret' instruction only)
}
现在很明显,这不是我调用 Aggregate 时运行的代码,因为...... Aggregate 做了一些事情。问题是反编译器的这个结果究竟意味着什么?什么是对“聚合”方法进行逆向工程的合适方法?
- 编辑 -
我刚刚意识到我上面所说的只有在Compact Framework项目中完成时才是正确的,当我反编译标准框架的 Aggregate 时,我得到了正确的源代码。