当dotpeek用“//存根方法(仅限'ret'指令)”填充方法时,这意味着什么?

本文关键字:方法 填充 什么 意味着 指令 仅限 dotpeek ret 存根 | 更新日期: 2023-09-27 18:33:02

我偶然发现了这个问题,询问了linq的聚合算法,并认为这是逆向工程最好回答的问题,所以我去了Visual Studio并编写了以下代码(此代码旨在用于紧凑框架项目,其中Combation函数只能有两个参数):

    public static string Combine(string path1, params string[] paths)
    {
        return paths.Aggregate(path1, System.IO.Path.Combine);
    }

然后,我将光标设置为聚合方法,按 F12 键(我安装了锐化器),并被引导到以下代码:

// 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)
}

现在显然,这不是我调用聚合时运行的代码,因为......聚合做一些事情。问题是反编译器的这个结果到底意味着什么?对"聚合"方法进行逆向工程的合适方法是什么?

--编辑--

刚刚意识到我上面所说的只有在紧凑框架项目中完成时才是正确的,当我反编译标准框架的聚合时,我得到了正确的源代码。

当dotpeek用“//存根方法(仅限'ret'指令)”填充方法时,这意味着什么?

如果要

反编译 CF 程序集,则必须使用实际的 BCL,而不是通常在 Studio 中用作引用的存根(不,我不知道他们为什么这样做)。 我看到您使用的是 3.9,所以我不确定您需要查看的路径,但对于 3.5,您可以在此处找到它们:

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