2

私は linq の集計アルゴリズムについて尋ねるこの質問に出くわし、これはリバース エンジニアリングによって最もよく答えられる種類の質問だと思ったので、Visual Studio に行き、次のコードを書きました (このコードは、Compact フレームワーク プロジェクトで使用することを意図しています)。ここで、Combine 関数は 2 つのパラメーターのみを持つことができます):

    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 を逆コンパイルすると、正しいソース コードが得られます。

4

1 に答える 1

0

CF アセンブリを逆コンパイルする場合は、通常 Studio で参照として使用されるスタブではなく、実際の BCL を使用する必要があります (いいえ、なぜそうしたのかわかりません)。3.9 を使用しているようですので、確認する必要があるパスはわかりませんが、3.5 の場合は、次の場所で見つけることができます。

C:\Program Files (x86)\Microsoft.NET\SDK\CompactFramework\v3.5\Debugger\BCL

于 2016-02-04T20:52:48.453 に答える