dnSpy 显示异步方法的奇怪反汇编代码

Col*_*tie 8 c# disassembly async-await .net-core dnspy

我正在尝试使用最新版本的 dnSpy 反汇编我的 .NET core 3.1 二进制文件,但得到的输出如下:

在此输入图像描述

原来的方法:

public async Task<List<FirmwarePackage>> CalculatePackagesDeltaAsync(List<FirmwarePackage> firmwarePackages) {
  var packagesToUpdate = await GetPackageDifferences(firmwarePackages);

  // sort packages
  // "version-update" packages should be updated last, with "mez" being last
  packagesToUpdate = packagesToUpdate
    .OrderBy(x => x.TargetType)
    .ThenBy(x => x.Name)
    .ToList();

  packagesToUpdate.RemoveAll(x => x.Name == "version-update");

  var versionPkgs = firmwarePackages
    .Where(x => x.Name == "version-update")
    .OrderBy(x => x.TargetType);

  packagesToUpdate.AddRange(versionPkgs);
  return packagesToUpdate;
}
Run Code Online (Sandbox Code Playgroud)

这是正常的吗?我怎样才能把它变成更容易理解的东西。尝试调试这是一场噩梦。

在 github 存储库上,该issues资源不可用,这就是我在这里询问的原因。

Roc*_*ber 9

对于那些在家观看的人来说,回应 @yoelhalb 的评论

实际上是选项->反编译器->C#->显示隐藏的反编译器生成的类和方法中的设置


Pet*_*ala 4

你在那里看到的一切是完全正常的。您所裁剪的只是生成代码的一部分。

突出显示的代码保存局部变量(作为状态机的字段)以保留其状态。

代码生成非常复杂,因为有几个用例以不同的方式处理。但一般的想法在以下文章中写得很好:

Stephen Toub 撰写了一篇博客文章,其中揭示了 .NET 团队在 .NET 5 中完成的一些优化。

  • 实际上它是“选项-&gt;反编译器-&gt;C#-&gt;显示隐藏的反编译器生成的类和方法”中的设置 (19认同)