如何反编译包含 lambda 的 .NET dll 以便构建

问题描述

我的生产系统开始出现问题。该代码面向 .NET Framework 4.5.2。我有以下问题:

  • 没有正式的构建和部署流程。所以不知道部署的是哪个版本的代码
  • 从可用源代码与生产中反编译的 DLL 的比较来看,我似乎在任何分支上都没有匹配项。看起来有人在源代码管理之外制作了一个版本并手动部署了它
  • 从事该系统工作的人多年前就离开了公司,留下来的人都不了解该系统

我一直在尝试通过反编译 dll 来恢复代码,并计划添加日志记录和热交换 dll 以跟踪问题。

我对某些 dll 有问题(11 个项目中有 3 个,总共可能有 10 个类)。对于某些类,反编译器会生成大量如下所示的代码

  [AsyncStateMachine(typeof(<AcceptSalesAgentLeadAssignment>d__9)),HttpPost]
        public Task<bool> AcceptSalesAgentLeadAssignment(SalesAgentWithLeadAssignmentsUpdateModel leadAssignment,string accountGuidAuth)
        {
            <AcceptSalesAgentLeadAssignment>d__9 d__;
            d__.leadAssignment = leadAssignment;
            d__.accountGuidAuth = accountGuidAuth;
            d__.<>t__builder = AsyncTaskMethodBuilder<bool>.Create();
            d__.<>1__state = -1;

从我在网上找到的信息来看,这与原始源代码中存在的匿名函数有关。这本身不会那么糟糕,但问题是这段代码是不可构建的。它产生了数以千计的错误,如下所示:

The name d__9 does not exist in the current context.

我尝试了以下工具: JetBrains dotpeek、dnSpy、Telerik JustDecompile、来自 redgate 的 .NET Reflector。他们都产生了这个无法构建的代码

我不需要生成代码完全可读。我只需要能够生成功能与生产中相同的 dll,以便我可以逐渐添加日志语句并跟踪问题。我知道反编译器无法计算出人造代码过去的样子,但它至少应该能够生成逻辑上等效且可构建的东西。有没有办法做到这一点?

解决方法

多亏了 Andy 的评论,我才发现了一个叫做 IL Spy 的工具。它生成了一个非常干净且几乎可构建的代码。出于某种原因,它无法处理 using 语句,并且弄乱了开关。但这很容易解决。谢谢安迪。