首页 > 解决方案 > 如何反编译包含 lambdas 的 .NET dll 以便构建

问题描述

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

我一直在尝试通过反编译 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,这样我就可以逐步添加日志语句并跟踪问题。我知道反编译器无法计算出人造代码过去的样子,但它至少应该能够产生逻辑上等效且可构建的东西。有没有办法做到这一点?

标签: c#.netdecompiling

解决方案


感谢 Andy 的评论,我被指向了一个名为 IL Spy 的工具。它生成了一个非常干净且几乎可构建的代码。由于某种原因,它无法处理 using 语句,并弄乱了开关。但这很容易解决。谢谢安迪。


推荐阅读