Visual Studio 支持外部源代码调试和反编译已经有一段时间了。然而,随着 Visual Studio 17.7的发布,调试器有了一个重大的飞跃,它为 .NET服务器托管网 库引入了自动反编译功能,使得 Visual Studio 中的外部代码调试变得更加流畅和轻松。它集成了反编译器,可以实时反编译外部代码,并根据需要将其无缝地集成到调试器中。
在本文中,我们将研究 Visual Studio 的自动反编译特性,强调其在调试和工程外部代码中的重要性。
探索自动反编译及其内部工作原理
Visual Studio 的调试器利用了 ILspy 反编译器引擎。它有助于将编译后的二进制代码(机器代码)转换回更高级的编程语言,如 C#。这意味着开发人员可以轻松地检查、排除故障并修复外部代码中的问题,就像他们正在处理自己的代码一样。
当涉及到外部源代码时,将自动反编译想象成 Visual Studio 调试器的备份计划:它首先在您的机器上搜索本地外部源代码,然后使用来自 PDB 文件的 Source Link 或 Source Server 信息来加载源代码。如果其他方法都失败,则调试器反编译代码以供显示。
虽然 Visual Studio 中的自动反编译特性提高了调试的效率,但 .NET 包作者可以完全控制他们是否想要他们的工作成果被反编译。这可以通过在程序集或模块中实现 SuppressIldasmAttribute 属性来实现,从而有效地防止 Visual Studio 启动反编译过程。虽然这个属性在 .NET 6+中已经过时了,但 Visual Studio 还是支持该属性。
再好的东西也有一定的局限性。当试图反编译 .NET 程序集以获得见解时,遇到限制并不罕见。如果你想了解更多,请参阅《Decompile .NET code while debugging 》
利用外部代码的自动反编译
还记得在 Visual Studio 中加载外部代码有点像解谜的日子吗?你不得不手动找出如何做到这一点,从“No Source Page”。但是现在,有了自动反编译,调试器会替您思考。您可以专注于完善您的代码,并且调试器确保您拥有所需的外部代码片段,它们应该在解决方案资源管理器中。
现在,让我们看看如何充分利用反编译场景来提高效率和生产力。
为了说明这一点,让我们考虑一下这个简单的 WPF 应用程序。我想引导您注意位于底部的调用堆栈窗口。目前,此窗口内的调用堆栈仅源自于代码中高亮显示的第12行相关的本地代码。
现在,激动人心的部分来了。在调用堆栈的顶部菜单上,您将看到一个标记为“show external code”的选项。选择此选项后,调用堆栈不仅会显示本地代码堆栈,还会显示外部代码组件。这里的外部代码主要是框架代码,如 PresentationCore.dll, WindowsBase.dll 等。
当我从外部代码单击这些调用堆栈时,它会在一瞬间自动为我反编译它。反编译代码虽然与原始源代码不同,但仍提供了对各种函数和组件如何工作的见解。
通过外部代码导航和调试
继续我们的旅程,这一过程超出了其最初的能力。让我们将焦点转移到解决方案资源管理器上,当您处于调试模式时,一个名为“External Sources”的特殊节点会出现在最顶部。
该节点充当虚拟文件浏览器,整齐地组织来自不同调用栈的反编译外部代码模块。
此设置允许我研究这些外部模块并检查代码的特定部分。通过在这段外部代码中放置断点,我可以再向前迈出重要的一步。这意味着,如果有必要,我可以在特定的点暂停代码的执行,就像我对自己的代码所做的那样,使外部代码调试尽可能无缝。
例如,在我的 WPF 应用程序中,我使用我的“MessageLibrary”来显示点击按钮时的通知。如下面的视频所示,我可以流畅地浏览外部代码,就像我在解决方案资源管理器中处理自己的代码一样。如果有必要,我还可以设置断点并通过这些文件进行调试。
当你使用一个严重依赖外部包和 dll 的应用程序时,这尤其方便。想象一下,您正在处理一个棘手的 bug,它可能隐藏在这些外部部件中。在这种情况下,深入了解这些外部部件将改变游戏规则,从而提高调试效率。
自动反编译非常有用,可以提高您的效率。但是,如果出于任何原因您想要关闭此自动功能,您可以通过设置选项 Debug > General> Automatically decompile to source when needed. (Managed only)
结论
总而言之,Visual Studio 中引入的自动反编译功能彻底改变了我们调试外部代码的方式。我们真的很想知道恁对这个新体验的看法。如果您有任何想法或建议,请在开发者社区网站上与我们分享。您的意见对我们非常有价值!
原文链接:https://devblogs.microsoft.com/visualstudio/ele服务器托管网vating-debugging-with-auto-decompilation-and-external-sources/
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
泛型是我们需要的程序设计手段。使用泛型机制编写的程序代码要比那些杂乱地使用 Object 变量,然后再进行强制类型转换的代码具有更好的安全性和可读性。 至少在表面上看来,泛型很像 C++ 中的模板。与 Java —样,在 C++ 中,模板也是最先被添加到语言中…